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

Twi*_*ngo 4 mysql sql select mariadb mariasql

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

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

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

我把它改成

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

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

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

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

多个 OR SELECT(无缓存运行 1000 次)- 12.863906860352 已过去 IN SELECT(无缓存运行 1000 次)- 122.73787903786 已过去

感谢您的时间。

Tim*_*sen 5

在查询中:

SELECT * FROM teams WHERE 'Joe Bloggs' IN (Team1,Team2,Team3)
Run Code Online (Sandbox Code Playgroud)

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

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

SELECT * FROM teams WHERE Team1='Joe Bloggs' OR Team2='Joe Bloggs' OR Team3='Joe Bloggs'
Run Code Online (Sandbox Code Playgroud)

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