mysql large varchar或text - 使用频繁访问的字段进行索引

mse*_*ert 5 mysql indexing varchar innodb

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

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

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

  • TEXT与表一起存储在表格之外.
  • 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?
Run Code Online (Sandbox Code Playgroud)

感谢您的输入.

Bil*_*win 6

首先,如果您的搜索使用了索引列,则无关紧要,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.