建立一个有可能受到点击和流量严重打击的系统。 这是典型的Apache / PHP / MySql设置。
之前已经构建了大量系统,但从未有过我真正需要就此大小的潜在可扩展性做出决策的情况。关于构建这个系列的系统,我有几十个问题,但对于这个特殊的问题,我正在尝试决定使用什么作为数据类型。
这是100英尺的视图:
我们有一张表(其中包括)有描述字段。我们已决定将其限制为 255个字符。它将是可搜索的( ie:显示包含... 的描述的所有条目)。问题:此表可能在某个时间点<数百万条 <(> em>左右我们认为)。
我还没有想出搜索的策略(MySql LIKE运算符可能很慢和/或我猜这么大的#记录的猪),但这是另一个SO问题。对于这个问题,我想知道将这个字段创建为tinytext,varchar和char 的专业和缺点是什么。
我不是数据库专家,所以任何和所有评论都是有帮助的。谢谢 -
答案 0 :(得分:15)
使用CHAR
。
BLOB
和TEXT
存储在行外,因此读取它们会受到访问惩罚。
VARCHAR
是可变长度的,这可以节省存储空间,可能会引入一个小的访问惩罚(因为行不是所有固定长度)。
但是,如果正确创建索引,VARCHAR
或CHAR
可以完全存储在索引中,这将使访问速度更快。
请参阅:varchar(255) v 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
顺便说一句,根据我的经验,对于简单查询(即LIKE
),MySQL regex
运算符比SELECT ID WHERE SOME_COLUMN REGEX 'search.*'
运算符快得多,而且显然更通用。
答案 1 :(得分:2)
我相信使用varchar你可以在低级别的实际数据库中存储一个可变长度,这意味着它可以占用更少的磁盘空间,即使一行不使用全部,文本字段也是固定长度的它。固定长度字符串应该更快查询。
编辑:我只是查了一下,文本类型也存储为可变长度。最好的办法是用mysqlslap
之类的东西来对它进行基准测试关于您的其他未提问题,您可能希望构建某种搜索索引,将描述字段中的每个有用单词分别与描述相关联,然后您可以将其编入索引并搜索它。将比使用%like%更快。
答案 2 :(得分:2)
在您的情况下,如果您使用LIKE
,则所有三种类型都是错误的(LIKE '%string%'
将不使用在该列上创建的任何索引,无论其类型如何)。其他一切都只是噪音。
我不知道TINYTEXT
和VARCHAR
最多255个字符之间有任何重大差异,CHAR
不适用于可变长度字符串。
所以我的建议是:选择VARCHAR
或TINYTEXT
(我个人会去VARCHAR)并使用像Lucene,Sphinx或任何其他的全文搜索引擎索引该列的内容你的工作。忘记LIKE
(即使这意味着您需要自己定制构建全文搜索索引引擎,无论出于何种原因,即您需要支持一组没有引擎可以满足的功能)。
答案 3 :(得分:2)
如果要在数百万行中进行搜索,请将所有这些文本存储在不同的表中(这将减少大表的行大小),如果文本数据很短,则使用VARCHAR
,如果使用,则使用TEXT需要更长的时间。
不使用LIKE
搜索,而是使用像Lucene,Sphinx或Solr这样的专业解决方案。我不记得哪个,但至少其中一个可以轻松配置为实时或接近实时索引。
修改强>
我在不同表中存储文本的建议减少了主表所需的IO,但是当插入数据时,它需要保留一个额外的索引并在选择中添加连接开销,所以只有在使用表读取一些时才有效一次描述和表中的其他数据被更频繁地使用。