mysql数据库怎么查看优化 mysql数据库查询语句优化


mysql数据库怎么查看优化 mysql数据库查询语句优化

文章插图
先来巩固一下索引的优点,检索数据快、查询稳定、存储具有顺序性避免服务器建立临时表、将随机的I/O变为有序的I/O 。
但索引一旦创建的不规范就会造成以下问题,占用额外空间,浪费内存,降低数据的增、删、改性能 。
所以只有在理解索引数据结构的基础上才能创建出高效的索引 。
**本文所有操作均在MySQL8.0.12**一、创建索引规范
在学习索引优化之前,需要对创建索引的规范有一定的了解,此规范来自于阿里巴巴开发手册 。
主键索引:pk_column_column唯一索引:uk_column_column普通索引:idx_column_column二、索引失效原因
创建索引需知道在什么情况下索引会失效,只有了解索引失效的原因,在创建索引时才不会出现一些已知错误 。
1.带头大哥不能死这句经典的语句就是涵盖创建索引时一定要符合最左侧原则 。
例如表结构为u_id,u_name,u_age,u_sex,u_phone,u_time
创建索引为idx_user_name_age_sex 。
查询条件必须带上u_name这一列 。
2.不在索引列上做任何操作不在索引列上做任何计算、函数、自动或者手动的类型转换,否则会进行全表扫描 。简而言之不要在索引列上做任何操作 。
3.俩边类型不等例如建立了索引idx_user_name,name字段类型为varchar
在查询时使用where name = kaka,这样的查询方式会直接造成索引失效 。
正确的用法为where name = “kaka” 。
4.不适当的like查询会导致索引失效创建索引为idx_user_name
执行语句为select * from user where name like “kaka%”;可以命中索引 。
执行语句为select name from user where name like “%kaka”;可以使用到索引(仅在8.0以上版本) 。
执行语句为select * from user where name like ‘’%kaka”;会直接导致索引失效
5.范围条件之后的索引会失效创建索引为idx_user_name_age_sex
执行语句select * from user where name = ‘kaka’ and age > 11 and sex = 1;
上面这条sql语句只会命中name和age索引,sex索引会失效 。
复合索引失效需要查看key_len的长度即可 。
总结:%在后边会命令索引,当使用了覆盖索引时任何查询方式都可命中索引 。
以上就是关于索引失效会出现的原因总结,在很多文章中没有标注MySQL版本,所以你有可能会看到is null 、or索引会失效的结论 。
三、SQL优化杀手锏之Explain在写完SQL语句之后必须要做的一件事情就是使用Explain进行SQL语句检测,看是否命中索引 。
下图就是使用explain输出格式,接下来将会对输出格式进行简单的解释 。
1.id这列就是查询的编号,如果查询语句中没有子查询或者联合查询这个标识就一直是1 。
如存在子查询或者联合查询这个编号会自增 。
2.select_type最常见的类型就是SIMPLE和PRIMARY,此列知道就行了 。
3.table理解为表名即可
4.**type此列是在优化SQL语句时最需要关注的列之一,此列显示了查询使用了何种类型 。
以下排序从最优到最差 。
system:表内只有一行数据const:最多只会有一条记录匹配,常用于主键或者唯一索引为条件查询eq_ref:当连接使用的索引为主键和唯一时会出现ref:使用普通索引=或<=> 运算符进行比较将会出现fulltext:使用全文索引ref_or_null:跟ref类型类似,只是增加了null值的判断,实际用的不多 。语句为where name = ‘kaka’ and name is null,name为普通索引 。index_merge:查询语句使用了俩个以上的索引,常见在使用and、or会出现,官方文档将此类型放在ref_or_null之后,但是在很多的情况下由于读取索引过多性能有可能还不如rangeunique_subquery:用于where中的in查询,完全替换子查询,效率更高 。语句为value IN (SELECT primary_key FROM single_table WHERE some_expr)index_subquery:子查询中的返回结果字段组合是一个索引(或索引组合),但不是一个主键或唯一索引range:索引范围查询,常见于使用 =, <>, >, >=, <, <=, IS NULL, <=>, BETWEEN, IN()或者like等运算符的查询中 。index:索引全表扫描,把索引从头到尾扫一遍all:全表扫描,性能最差 。5.possible_keys此列显示的可能会使用到的索引


以上关于本文的内容,仅作参考!温馨提示:如遇健康、疾病相关的问题,请您及时就医或请专业人士给予相关指导!

「四川龙网」www.sichuanlong.com小编还为您精选了以下内容,希望对您有所帮助: