我一直在忙着更改一些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树索引在各个列中查找它们.这的行为与您期望的和正在看到的一样.
标签:select,mariadb,mariasql,sql,mysql
来源: https://codeday.me/bug/20191025/1925637.html