我正在构建一个将存储大量文本的数据库系统。
文本将存储在一个包含 id 列和 varchar/text 列的表中。
我想知道使用一个使用大 varchar 的单个表或使用多个表(每个表使用不同的文本类型)是否会更有效。
多表选项将包含多个不同的表,每个表使用不同类型的文本(tinytext、text 等),系统将根据文本的长度将文本存储在最合适的表中。
我既关心速度又关心存储空间,并且想要一个平衡两者的解决方案。
编辑 -
不会搜索文本表,但可以连接它(通常会确定一个 ID 号,然后访问单行)。
大小通常会小于文本,但有些会足够大以需要中等文本。我怀疑是否需要长文本。
最佳答案
保持简单!说真的。
除非您的绝大多数文本项都不超过 255 个字符,否则只需使用 TEXT
或 LONGTEXT
。将时间花在文本上做有趣的事情,而不是摆弄复杂的数据结构。立即完成您的项目;稍后优化。
磁盘驱动器和 RAM 的价格比现在便宜得多。
如果您的应用要求绝对需要您使用 varchar 数据(因为其简洁性和可搜索性)而不是文本数据,您可以执行以下操作。
创建一个 article
表,每篇文本文章一行。它将包含管理文章所需的所有内容,包括标题、作者和 article_id
。
创建第二个表,名称类似于article_text
。它可能有四列。
article_id foreign key to article table.
language a language code, if you happen to store translations of articles
ordinal a sequence number
textfrag varchar(255) part of the text.
将每篇文章的文本存储在一系列具有升序 ordinal
值的 article_text
行中。每个 textfrag
最多可容纳 255 个字符的文本。要检索文章的文本,您将使用这样的查询。
SELECT textfrag
FROM article_text
WHERE language = 'en_US' /* or whatever */
AND article_id = 23456 /* or whatever */
ORDER BY ordinal
然后,您将获取一堆行,连接 textfrag
项的内容,这样您的文章就没有有效长度限制。如果您创建一个包含所有字段的索引,那么您的检索时间将会非常快,因为所有检索都将来自该索引。
(article_id, language, ordinal, textfrag)
如果您尽最大努力将文本在单词边界处分割成片段,并且使用 MyISAM,并且使用 FULLTEXT 索引,那么您将获得一个非常有效的全文搜索系统。
关于mysql - 将不同大小的文本存储在不同的mysql表中是否有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17901286/