任何有实际经验的人,如果字段有一个普通的INDEX,LIKE查询在数百万行表中如何在速度和效率方面执行?
对于在数百万行表上执行数据库字段搜索,是否有更好的替代方法(不会过滤结果,如FULLTEXT 50%规则)?
示例:
Schema (comments table)
id (PRIMARY) title(INDEX) content time stamp
Query
SELECT * FROM 'comments' WHERE 'title' LIKE '%query%'
答案 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%'