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的数据。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
MySQL for update锁表还是锁行校验(过程详解)
在MySQL中,使用for update子句可以对查询结果集进行行级锁定,以便在事务中对这些行进行更新或者防止其他事务对这些行进行修改,这篇文章主要介绍了MySQL for update锁表还是锁行校验,需要的朋友可以参考下2024-02-02如何通过配置自动实现ValueList中hql语句的整型参数转换
本篇文章是对通过配置自动实现ValueList中hql语句的整型参数转换进行了详细的分析介绍,需要的朋友参考下2013-06-06CentOs7安装部署Sonar环境的详细过程(JDK1.8+MySql5.7+sonarqube7.8)
这篇文章主要介绍了CentOs7安装部署Sonar环境(JDK1.8+MySql5.7+sonarqube7.8),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2023-06-06MySQL中distinct语句的基本原理及其与group by的比较
这篇文章主要介绍了MySQL中distinct语句的基本原理及其与group by的比较,一般情况下来说group by和distinct的实现原理相近且性能稍好,需要的朋友可以参考下2016-01-01
最新评论