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 已过去
感谢您的时间。
在查询中:
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 树索引在各个列中查找它们。这与您所期望的和看到的一样。
| 归档时间: |
|
| 查看次数: |
198 次 |
| 最近记录: |