MySQL上数百万行表的LIKE查询性能

时间:2012-07-10 17:44:42

标签: mysql database performance processing-efficiency

任何有实际经验的人,如果字段有一个普通的INDEX,LIKE查询在数百万行表中如何在速度和效率方面执行?

对于在数百万行表上执行数据库字段搜索,是否有更好的替代方法(不会过滤结果,如FULLTEXT 50%规则)?

示例:

Schema (comments table)

id (PRIMARY) title(INDEX) content time stamp

Query

SELECT * FROM 'comments' WHERE 'title' LIKE '%query%'

5 个答案:

答案 0 :(得分:14)

如果您在模式的开头有%,则LIKE将执行全表扫描。

您可以在布尔(而非自然语言)模式下使用FULLTEXT来避免50%规则。

  

布尔全文搜索具有以下特征:

     

他们不使用50%的门槛。

http://dev.mysql.com/doc/refman/5.0/en/fulltext-boolean.html

答案 1 :(得分:8)

  

来自任何有实际经验的人,LIKE查询如何执行   MySQL在数百万行表上,在速度和效率方面,如果   该领域有一个普通的INDEX?

不太好(我想我在900k范围内进行过一些搜索,不能说我有数百万行的经验)。

通常您应该以任何方式限制搜索,但这取决于表结构和应用程序用例。

此外,在某些 Web 用例中,可以通过一些技巧实际改善性能和用户体验,例如索引单独的关键字并创建关键字表和rows_contains_keyword(id_keyword,id_row)表。关键字表与AJAX一起用于建议搜索术语(简单单词)并将它们编译为整数 - id_keywords。此时,查找包含这些关键字的行会快速 。一次更新一行表也非常有效;当然,批量更新成为明确的“不要”。

如果只使用+运算符,那么这与full text MATCH..IN BOOLEAN MODE已经完成的不同:

SELECT * FROM arts WHERE MATCH (title) AGAINST ('+MySQL +RDBMS' IN BOOLEAN MODE);

你可能想要一个InnoDB表来做到这一点:

  

布尔全文搜索具有以下特征:

     
      
  • 它们不会按相关性降低的顺序自动对行进行排序。   ...
  •   
  • InnoDB表需要在MATCH()表达式的所有列上使用FULLTEXT索引来执行布尔查询。即使没有FULLTEXT索引,针对MyISAM搜索索引的布尔查询也可以工作,尽管以这种方式执行的搜索会非常慢。   ...
  •   
  • 他们不使用适用于MyISAM搜索索引的50%阈值。
  •   

您能否就具体案例提供更多信息?

答案 2 :(得分:7)

我建议您通过其他条款限制查询(例如日期范围),因为LIKE '%something'可以保证全表扫描

答案 3 :(得分:0)

使用Workbench,在SELECT之前使用EXPLAIN来测试使用LIKE(带或不带INDEX)的不同条件,并在搜索词的不同部分使用通配符。根据测试,您将得出自己的结论,因为每种情况都是特定情况。

答案 4 :(得分:0)

您可以执行 Subselect 以获取最新的寄存器。

select s.* from (select * from my_table order by "create" desc  limit 10) as s
where   s.event like '%status%'