6

我有一个字段“descr”varchar(15000),它将定期保存每行 1000 到 5000 个字符的文本,在每个查询中返回,并且会经常使用 LIKE %search% 进行搜索(数据库是 mysql 5.5 和全文索引不可用)。输入的文本是研究数据,因此不需要唯一性 - 但可搜索是必要的。

该表是带有 utf-8 编码的 innodb。行数不大(30,000)。varchar 上的最大索引大小为 (255),但是当我对列进行搜索时,它正确地返回了一行输入 3000 个字符的行。

我已经阅读了很多关于索引的内容,最相关的是MySQL:Large VARCHAR vs. TEXT?

  • TEXT 与 table 一起存储在 table 之外。
  • VARCHAR 是内联存储的,当大小合理且经常检索数据时速度会快得多。

我需要帮助理解:

 1. What is the performance impact on retrieval (with 30,000 rows)
    going to a text field and     
 2. Is a varchar index workable for
    searching through 3000-5000 character fields? How is the search able
    to find strings with data longer than the 255 varchar index anyway?
    Or would you advise going with mediumtext?

感谢您的输入。

4

1 回答 1

9

首先,如果您的搜索使用该列,那么您如何索引该列并不重要,LIKE %search%因为该谓词不能使用 BTREE 索引。无论您选择 VARCHAR 还是 TEXT,它都会进行表扫描。

其次,InnoDB 存储 VARCHAR 和 TEXT 的方式没有区别。它们都作为可变长度字符串处理。如果它们可以与其他列放在同一数据页上,那么它们可以。如果它们对于一页来说太长(或者实际上不到一页的一半,因为每页必须至少容纳两行,加上一些标题信息),那么页面上只存储 768 个字节,其余的的字符串继续溢出页面。除非您声明要使用的表ROW_FORMAT=DYNAMIC,在这种情况下,如果它不适合页面,所有字符串都会出现在溢出页面上。另见http://www.mysqlperformanceblog.com/2010/02/09/blob-storage-in-innodb/

您可能还对我的演示文稿全文搜索Throwdown感兴趣。我比较了其他配套技术,例如 Sphinx Search。

于 2013-10-26T00:05:03.320 回答