INDEX如何减慢LIKE查询的速度?

时间:2013-04-04 14:52:06

标签: mysql indexing

这既不是MySQL index slowing down query也不是Slow search by index query LIKE% MYSQL

的重复

在一个非常简单的表上,我尝试了一个非常简单的查询,有或没有特定的索引。

表(40 000行):

id                      int(11)     
shipping_address_id     int(11)     
billing_address_id      int(11)     
label                   varchar(100)
code                    varchar(15) 
email                   varchar(100)

查询:SELECT email FROM table WHERE email LIKE "%yahoo%"

如果没有INDEX"电子邮件",则需要0.0035秒。但是,使用此INDEX,需要0.021秒,这要慢7倍。

然而,相同的INDEX确实将等同查询加速了50倍(WHERE email = "me@yahoo.com")。

那么,为什么LIKE查询会对INDEX产​​生负面影响?

编辑TYPO :查询最初说明LIKE "yahoo",但应该阅读LIKE "%yahoo%",我很抱歉。

编辑CLARITY:该表是InnoDB,我正在比较相同查询的速度。在第一种情况下(" LIKE"情况),在比较字段上使用INDEX,查询速度慢7倍。在第二种情况下(" =")使用INDEX,查询速度提高了50倍。

1 个答案:

答案 0 :(得分:1)

索引使用比较运算符隐式解决(并加速)查询:=,<,>。如果您在email字段和LIKE查询上有索引,则MySQL 以检索所有索引中的元素,并且将正则表达式应用于它们。

如果查询是

 WHERE email LIKE 'yahoo%com'

你可以通过观察email必须介于'yahoo'和'yahoo ['之间来加快速度(让我们假设[按照字典顺序排在z后面,并且不能出现在email中)领域)。然后将查询更改为

WHERE (email BETWEEN 'yahoo' AND 'yahoo[') AND email LIKE 'yahoo%com'

会产生一个好处,因为索引会快速预先选择一组较小的行,然后然后 regexp将仅针对那些行(在已经可用的字段上运行,因为它在索引,因此不需要查表表。)

但在这种情况下,实际上, MySQL必须进行全表扫描;除了它是在索引上这样做。这样做的成本实际上可能比“真正的”表扫描更高。在某些情况下,MySQL会意识到这一点,你会发现该查询根本就是未使用(取决于它最近的分析,它的大小和其他因素),和MySQL更喜欢使用全表扫描。

索引可能通过收集查询所需的数据来帮助您的另一种情况也不适用,因为您只需要email字段,这是正在进行的计算。因此,该指数再次没有产生任何性能提升。

如果你想要一个加速这种WHERE的索引,你需要一个FULLTEXT索引,而不是一个“普通”索引。