MySql优化-你的SQL命中索引了吗
来源:互联网 发布:mac怎么从b站下视频 编辑:程序博客网 时间:2024/05/17 00:10
在项目开发中SQL是必不可少的,表索也一样.这些SQL的运行性能不知道吗?有多少是命中了索引的?命中哪个索引?索引中有哪个是无效索引?这些无效索引是否会影响系统的性能?带着这些问题我们一起来学习一下.
MySql中是通过 Explain 命令来分析低效SQL的执行计划。命令的使用很简单.
示例 explain select * from adminlog
执行结果:
idselect_typetablepartitjonstypepossible_keyskeykey_lenrefrowfilteredExtra1SIMPLEadminlog
ALL
2100
ALL
2100
执行结果每一列的说明:
1、 select_type : 查询类型,常见的值[SIMPLE:简单表,不使用表连接或子查询。PRIMARY : 主查询,外层的查询。UNION 第二个或者后面的查询语句。SUBQUERY : 子查询中的第一个select]
2、table :输出结果的表
3、type : 表示MySql在表中找到所需行的方式,或者叫访问类型。常见的类型:
ALLindexrangerefeq_refconst,systemNULL
从左到右,性能由最差到最好。
3.1 type=ALL 全表扫描,
3.2 type=index 索引全扫描,遍历整个索引来查询匹配的行
3.3 type=range 索引范围扫描,常见于 <,<=,>,>=,between,in等操作符。
例
explain select * from adminlog where id>0 ,
explain select * from adminlog where id>0 and id<=100
explain select * from adminlog where id in (1,2)
3.4 type=ref 使用非唯一索引或唯一索引的前缀扫描,返回匹配某个单独值的记录行。ref还经常出现在JOIN操作中
3.5 type=eq_ref 类似于ref,区别就在使用的索引是唯一索引,对于每个索引键值,表中有一条记录匹配;简单来说,说是多表连接中使用 主建或唯一健作为关联条件
3.6 type=const/system 单表中最多有一个匹配行。主要用于比较primary key [主键索引]或者unique[唯一]索引,因为数据都是唯一的,所以性能最优。条件使用=。
3.7 type=NULL 不用访问表或者索引,直接就能够得到结果
例 explain select 1 from dual,类型type 还有其他值 如ref_or_null : 与ref 类似,区别在于条件中包含对NULL的查询. index_merge : 索引合并优化, unique_subquery : in的后面是一个主键字段的子查询。index_subquery : 与 unique_subquery 类似,区别在于in的后面是查询非唯一索引字段的子查询
4、possible_keys : 可能使用的索引列表.
5、key : 实现执行使用索引列表
6、key_len : 索引的长度
7、ref : 显示使用哪个列或常数与key一起从表中选择行。
8、row : 执行查询的行数,简单且重要,数值越大越不好,说明没有用好索引
9、filtered:
10、Extra: 该列包含MySQL解决查询的详细信息。
10.1 Not exists
10.2 range checked for each record
没有找到合适的索引
10.5 using index 只使用索引树中的信息而不需要进一步搜索读取实际的行来检索表中的信息。就是建议取索引列。这样就可以不要通过索引去实际表中找数据了。直接返回索引列的数据。一次查询。否则就是索引表查一次,实际表中查一次。
10.6 using temporary
为了解决查询,MySQL需要创建一个临时表来容纳结果。典型情况如查询包含可以按不同情况列出列的GROUP BY和ORDER BY子句时。
无效索引: 数据变化不大的列。如XX类型,是否有效,项目ID等列的索引都是无效的。这些无效索引还是影响Insert 、Update、Delete 语句的性能。因为这些语包的执行都要对索引表进行更新。又因为这些表的值变化不大,数据库很难为他们合理分配索引。所以影响语句的性能。
IN,OR 是否会走索引:
一条SQL会不会走索引一个看条件使用的运算符,另一个看有没有索引。所以SQL会不会走索引和IN.OR,group by 没有关系。
什么运算符不走索引,<>,!=
OR 有个点要注意一下:就OR前后两个条件都要有索引整个SQL才会使用索引。只要有一个条件没索引那么整个SQL都不使用索引。
如果出现OR的一个条件没有索引时,建议使用 union
例:
constPRIMARYPRIMARY4const1100.00
2UNIONadminlog
ALL
1110.00Using where
UNION RESULT<union1,2>
ALL
Using temporary
explain SELECT * FROM cbdfinance.adminlog where id = 1
union SELECT * FROM cbdfinance.adminlog where OriginalData='UpdateModelErrorMsg';
结果:
1PRIMARYadminlogconstPRIMARYPRIMARY4const1100.00
2UNIONadminlog
ALL
1110.00Using where
UNION RESULT<union1,2>
ALL
Using temporary
使用OR第二个条件没有索引:
explain SELECT * FROM cbdfinance.adminlog where id = 1 or OriginalData='UpdateModelErrorMsg';
结果:
1SIMPLEadminlog
ALLPRIMARY
1118.18Using where
ALLPRIMARY
1118.18Using where
explain SELECT * FROM cbdfinance.adminlog where id = 1 or id=2;
explain SELECT * FROM cbdfinance.adminlog where id = 1 or SearchText1='UpdateModelErrorMsg';
explain SELECT * FROM cbdfinance.adminlog where id in (1,2)
explain SELECT * FROM cbdfinance.adminlog group by SearchText1
阅读全文
0 0
- MySql优化-你的SQL命中索引了吗
- MySql优化-你的SQL命中索引了
- MySql优化-索引命中
- mysql索引命中的问题
- mysql 联合索引的命中规则
- mysql索引命中规则
- mysql索引命中分析
- MySQL SQL优化:碍手碍脚的索引
- Mysql-索引-BTree类型 ” 的sql优化
- mysql sql优化与索引
- 一步一步优化你的mysql------创建高性能的索引
- Mysql索引的优化
- mysql 的索引优化
- MySQL索引的优化
- mysql 索引的优化
- MySQL索引的优化
- mysql索引的优化
- Mysql的索引优化
- tomcat6.0.30 免安装版配置
- 2017最新苹果开发者账号注册、付款流程图解【图文并茂】
- 调用Java NIO提高文件读写速度(1)
- linux下编程epoll实现将GPS定位信息上报到服务器
- AndroidStudio fetching document
- MySql优化-你的SQL命中索引了吗
- ubuntu安装wine 和 source Insight
- 精华dubbo+zookeeper+springmvc+mybatis+shiro+redis分布式大型互联网企业架构!
- java引用类型的应用
- JAVA NIO 简介
- Web基础之反射机制优化JDBC中DAO层对象的封装
- 多Qt版本冲突导致编译异常的解决方法
- java 访问控制修饰符public、 protected、 默认、private
- Java如何遍历对象的4种方法