我一直在忙着更改一些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选择(运行1000次没有缓存)-过去了12.863906860352
IN SELECT(运行1000次,没有缓存)-过去了122.73787903786
感谢您的时间.
解决方法:
在查询中:
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树索引在各个列中查找它们.这的行为与您期望的和正在看到的一样.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。