这既不是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倍。
答案 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
索引,而不是一个“普通”索引。