mysql or 查询_MySQL中使用OR连接查询条件不会让索引失效

今天听到一种说法,说OR会使索引失效,最好使用UNION代替。查了一下发现的确有些文章这么说。但总觉得没什么道理。直觉上觉得虽然or连接的查询条件不能使用联合索引,但感觉两个单独的索引是可以用的。看了一些文章,感觉一直很疑惑。

于是试了一下,发现果然如此。

explain SELECT * from t WHERE id = 1 or uid = 2;

id

select_type

table

type

possible_keys

key

ref

rows

Extra

1

SIMPLE

t

index_merge

PRIMARY,uid

PRIMARY,uid

2

Using union(PRIMARY,uid); Using where

这里的type项是index_merge。搜索后发现是MySQL5.0后的新技术,索引合并。index merge 技术简单说就是在用OR,AND连接的多个查询条件时,可以分别使用前后查询中的索引,然后将它们各自的结果合并交集或并集。当然具体是否使用index merge,优化器会自己选择,比如and连接时有联合索引,或干脆全表查询就很快,就没必要使用它了。

具体可以查阅文档:https://dev.mysql.com/doc/refman/5.6/en/index-merge-optimization.html

还是很有意思的。

可能因为mysql这个东西太复杂,感觉sql优化都快成玄学了。网上流传了很多“奇技淫巧”,让人真假难辨。我觉得可能是过去mysql优化不是很好时,大家有一些优化的技巧,但随着mysql更新优化,现在已经成为过时甚至错误的做法。但这些说法还在流传,造成了我这样的新手的困惑。

所以看来小白要学技术,还是要踏实点多看官方文档,多亲自实践,少看博客,少道听途说。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值