【问题标题】:How can INDEX slow down a LIKE query?INDEX 如何减慢 LIKE 查询?
【发布时间】:2013-04-04 14:52:05
【问题描述】:

这既不是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%"

如果“电子邮件”没有索引,则需要 0.0035 秒。然而,使用这个 INDEX,它需要 0.021 秒,慢了 7 倍。

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

那么,为什么 LIKE 查询会受到 INDEX 的负面影响?

编辑错字:该查询最初是 LIKE "yahoo",而它应该是 LIKE "%yahoo%",我很抱歉。

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

【问题讨论】:

  • 您正在比较两个不同的查询。您没有正确隔离是否仅使用索引。您的测试无效。
  • 对不起,我不明白你的意思。我只与一个查询(“LIKE”)进行比较。另一个查询 ("=") 只是在这里表明 INDEX 可以使用它。在你说我写无效的东西之前你是不是读得太快了?

标签: mysql indexing


【解决方案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'

会产生好处,因为索引会快速预先选择一组较小的行,并且 然后 正则表达式将仅针对这些行(在已经可用的字段上,因为它位于索引,因此不需要查找表)。

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

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

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

【讨论】:

  • MySql 声称他们可以使用 LIKE 不以通配符开头的索引。 dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html 所以,我相信这里发生了其他事情。
  • 可能该表不是InnoDB,并且具有非BTree索引。 BTree 索引管理器自动实现“restrict then regexp”优化,其他管理器没有。另一种可能是索引 LIKE 实现了比非索引 L​​IKE 更慢的字符串匹配算法(实际上,当我回答时,我相信 OP 的查询在 'yahoo' 之后包含通配符)
  • 感谢 Iserni 为您制定的答案。很抱歉,因为有错字,请参阅问题中的编辑。所以你的原始答案(你认为有通配符)适用于我的真正问题:) 我知道当列被索引时,LIKE 是在索引而不是整个列上完成的,并且索引上的 LIKE 不是以相同的方式实施,这可能会导致性能下降。仍然很奇怪,但现在我明白了。谢谢。
猜你喜欢
  • 2020-04-23
  • 1970-01-01
  • 2014-01-30
  • 2021-07-09
  • 2012-06-20
  • 2019-05-14
  • 2011-10-04
  • 2012-06-11
  • 1970-01-01
相关资源
最近更新 更多