MySql Tinytext vs Varchar vs Char

One*_*erd 29 php mysql sql database database-design

建立一个有可能受到点击和流量打击的系统.这是典型的Apache/PHP/MySql设置.

之前已经构建了大量系统,但从未有过我真正需要就此大小的潜在可扩展性做出决策的情况.我有几十个关于构建这个系列的系统的问题,但对于这个特定的问题,我正在尝试决定使用什么作为数据类型.

这是100英尺的视图:

我们有一个表(除其他外)有一个描述字段.我们决定将其限制为255个字符.它将是可搜索的(即:显示包含......的描述的所有条目).问题:这个表在某些时候可能有数百万条目(或者我们认为).

我还没有想出搜索的策略(MySql LIKE运算符可能很慢和/或我猜测这么大的#记录的猪),但那是另一个SO问题.对于这个问题,我想知道将这个字段创建为tinytext,varchar和char的专业和缺点是什么.

不是数据库专家,因此任何和所有评论都是有帮助的.谢谢 -

Set*_*eth 15

用一个CHAR.

BLOB's和TEXT's存储在行外,因此读取它们会受到访问惩罚. VARCHAR是可变长度,这可以节省存储空间可能会引入一个小的访问惩罚(因为行不是所有固定长度).

如果你正确地创建索引,但是,无论是VARCHARCHAR可以完全存储在索引中,这将使访问速度快了很多.

请参阅:VARCHAR(255)诉TINYBLOB v TINYTEXT
和:http://213.136.52.31/mysql/540
和:http://forums.mysql.com/read.php?10,254231,254231#msg-254231
和:http://forums.mysql.com/read.php?20,223006,223683#msg-223683

顺便说一句,根据我的经验,MySQL regex运算符比LIKE简单查询(即SELECT ID WHERE SOME_COLUMN REGEX 'search.*')更快,并且显然更通用.


pro*_*php 2

我相信使用 varchar ,您可以在低级别的实际数据库中存储可变长度,这意味着它可以占用更少的磁盘空间,即使一行不使用全部文本字段,文本字段也具有固定长度。固定长度的字符串查询起来应该更快。

编辑:我刚刚查了一下,文本类型也存储为可变长度。最好的办法是使用 mysqlslap 之类的工具对其进行基准测试

关于您的其他未提出的问题,您可能希望构建某种搜索索引,将描述字段中的每个有用单词分别与描述联系起来,然后您可以对其进行索引并进行搜索。会比使用 %like% 快得多。