mysql or 速度,MySQL对多个OR使用索引,但对IN不使用索引,并且速度慢得多

我一直在忙着更改一些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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值