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

标签 mysql sql select mariadb mariasql

我一直忙于更改一些 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/

相关文章:

mysql - 一次将相同的固定百分比插入多行

python - Pandas 选择倒数第二列也不是 nan

MySQL-python:SELECT 返回 'long' 而不是查询

MySQL:为什么在此查询中将 "1+1"视为 "1"?

mysql - 使用 Scala 解析 AWS Glue 中的 MySQL 0000-00-00 日期格式

MySQL 用户定义变量和动态列上的 ORDER BY

mysql - MySQL 中何时使用单引号、双引号和反引号

mysql - 从 PostgreSQL 中的 group by 子句中获取特定行

php - 在测试服务器上的 php 文件中出现错误,但在本地主机中没有错误

php - 如何为此表单编写搜索查询