首页 技术 正文
技术 2022年11月20日
0 收藏 301 点赞 2,923 浏览 2616 个字

在项目开发中SQL是必不可少的,表索也一样.这些SQL的运行性能不知道吗?有多少是命中了索引的?命中哪个索引?索引中有哪个是无效索引?这些无效索引是否会影响系统的性能?带着这些问题我们一起来学习一下.  MySql中是通过 Explain 命令来分析低效SQL的执行计划。命令的使用很简单.示例 explain select * from adminlog执行结果:

id select_type table partitjons type possible_keys key key_len ref row filtered Extra
1 SIMPLE adminlog   ALL         2 100  

执行结果每一列的说明:MySql优化-你的SQL命中索引了吗1、 select_type : 查询类型,常见的值[SIMPLE:简单表,不使用表连接或子查询。PRIMARY : 主查询,外层的查询。UNION 第二个或者后面的查询语句。SUBQUERY : 子查询中的第一个select]2、table :输出结果的表3、type : 表示MySql在表中找到所需行的方式,或者叫访问类型。常见的类型:

ALL index range ref eq_ref const,system NULL

从左到右,性能由最差到最好。  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) MySql优化-你的SQL命中索引了吗  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 例:

explain SELECT * FROM cbdfinance.adminlog where id = 1
union SELECT * FROM cbdfinance.adminlog where OriginalData=’UpdateModelErrorMsg’;

结果:

1 PRIMARY adminlog   const PRIMARY PRIMARY 4 const 1 100.00  
2 UNION adminlog   ALL         11 10.00 Using where
  UNION RESULT <union1,2>   ALL             Using temporary

使用OR第二个条件没有索引:explain SELECT * FROM cbdfinance.adminlog where id = 1 or OriginalData=’UpdateModelErrorMsg’;结果:

1 SIMPLE adminlog   ALL PRIMARY       11 18.18 Using 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

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:8,967
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,487
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,332
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,115
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,748
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,783