gpt4 book ai didi

MySQL 对多个 OR 使用索引,但对 IN 没有索引而且速度慢得多

转载 作者:可可西里 更新时间:2023-11-01 08:02:20 27 4
gpt4 key购买 nike

我一直忙于更改一些 SQL 查询,以便它们看起来更易于人眼阅读,我还被告知它们可能会快 5-10%。

以前的 SQL 语句看起来像这样。

SELECT * FROM teams WHERE Team1='Joe Bloggs' OR Team2='Joe Bloggs' OR Team3='Joe Bloggs'

我改成了

SELECT * FROM teams WHERE 'Joe Bloggs' IN (Team1,Team2,Team3)

新查询大约慢了 10 倍,在检查了可能的原因后我发现它没有使用任何索引,即使我试图强制索引它仍然不会使用它。

该表有大约 120,000 行,我无法更改表格式,因为我无权访问的其他应用程序,请使用它。 Team1,Team2,Team3列都是VARCHAR(45)

谁能解释为什么索引用于原始查询而不是新查询?我已经阅读了大量页面但找不到答案,我已经读到它可能是 mysql 确定它更快地不使用索引,但是这里不应该是这种情况,因为 IN 查询几乎慢了 10 倍。

多个 OR SELECT(运行 1000 次,没有缓存)- 12.863906860352 已过在 SELECT 中(运行 1000 次,没有缓存)- 122.73787903786 elapsed

感谢您的宝贵时间。

最佳答案

在查询中:

SELECT * FROM teams WHERE 'Joe Bloggs' IN (Team1,Team2,Team3)

您正在比较(查找)一堆列与字符串文字。优化器通常会使用搜索目标的索引,在本例中为 Joe Bloggs,以在 IN 子句中查找值。但是,它不能在字符串文字上放置索引。所以,这里的一切都颠倒了,这就是索引无济于事的原因。

另一方面,在您的第一个查询中:

SELECT * FROM teams WHERE Team1='Joe Bloggs' OR Team2='Joe Bloggs' OR Team3='Joe Bloggs'

MySQL 会抓取字符串文字,然后使用 B 树索引在各个列中查找它们。这与您预期和看到的一样。

关于MySQL 对多个 OR 使用索引,但对 IN 没有索引而且速度慢得多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51540919/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com