mysql关于or的索引的问题及解决

 更新时间:2023年08月30日 10:05:00   作者:某科学的南条  
这篇文章主要介绍了mysql关于or的索引的问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

mysql关于or的索引问题

用UNION替换OR (适用于索引列)

在下面的例子中,LOC_ID 和REGION上都建有索引*

高效:

select loc_id , loc_desc , region from location where loc_id = 10   
union   
select loc_id , loc_desc , region  from location where region = "melbourne"   

低效:

select loc_id , loc desc , region from location where loc_id = 10 or region = "melbourne" 

如果你坚持要用OR,那就需要返回记录最少的索引列写在最前面。

mysql or不走索引分析

select * from tableName where a=1 and (b=1 or c=1)

其中建立了ab和ac的联合索引,但是看db监控慢查询的扫描行数和a=1的行数相同。

通过explain看出执行计划是走ab的联合索引,但是为啥扫描行数却是a=1的行数呢?

猜测是因为要查a=1 and b=1的数据时候,可以走ab索引,但是查出 a=1和c=1的数据,就需要扫描a=1的所有数据。

可以通过联合索引的数据结构看出,当a相同时候,会按照b来排序。

而且mysql一般不会选择走多个索引,除非要索引合并,但是通过explain看出来并没有索引合并。

所以只会走ab的索引&扫描a=1的所有数据来获取c=1的数据。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

最新评论