查询优化本就不是一蹴而就的,需要学会使用对应的工具、借鉴别人的经验来对SQL进行优化,并且提升自己。
先来巩固一下索引的优点,检索数据快、查询稳定、存储具有顺序性避免服务器建立临时表、将随机的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输出格式,接下来将会对输出格式进行简单的解释。
1.id 这列就是查询的编号,如果查询语句中没有子查询或者联合查询这个标识就一直是1。
如存在子查询或者联合查询这个编号会自增。
2.select_type
最常见的类型就是SIMPLE和PRIMARY,此列知道就行了。
3.table
理解为表名即可
4. **type
此列是在优化SQL语句时最需要关注的列之一,此列显示了查询使用了何种类型。
以下排序从最优到最差。
5.possible_keys
此列显示的可能会使用到的索引
6. **key
优化器从possible_keys中命中的索引
7.key_len
查询用到的索引长度(字节数),key_len只计算where条件用到的索引长度,而排序和分组就算用到了索引,也不会计算到key_len中。
8.ref
如果是使用的常数等值查询,这里会显示const。
如果是连接查询,被驱动表的执行计划这里会显示驱动表的关联字段。
如果是条件使用了表达式或者函数,或者条件列发生了内部隐式转换,这里可能显示为func。
9. **rows
这是mysql估算的需要扫描的行数(不是精确值)。
这个值非常直观显示 SQL 的效率好坏, 原则上 rows 越少越好。
10.filtered
此列表示存储引擎返回的数据在server层过滤后,剩下多少满足查询的记录数量的比例,注意是百分比,不是具体记录数
11. **extra
在大多数情况下会出现以下几种情况。
12.总结
以上就是关于Explain所有列的说明,在平时开发的过程中,一般只会关注type、key、rows、extra这四列。
上文说到了可以直接使用explain来分析自己的SQL语句是否合理,接下来再聊一个点那就是慢查询。
查看慢查询是否打开
查看是否记录没有使用索引的SQL语句
开启慢查询、开启记录没有使用到索引的SQL语句
set global log_queries_not_using_idnexes='on'; set global log_queries_not_using_indexes='on';
查询以上俩个配置是否打开
设置慢查询时间,这个时间由自己把控,一般1s即可 set globle long_query_time=1;
如果查看这个时间没有变,则关于客户端在重新连接一次即可。
查看慢查询存储位置
然后随便执行一条不执行索引的语句即可在这个日志中查看到此语句
上图中一般需要主要观察的是Query_time、SQL语句内容。
以上就是关于如何使用慢查询来查看项目中出现问题的SQL语句。
此处跟大家聊一些常用的SQL语句优化方案,以上的俩个工具要好好的利用,辅助我们进行打怪。
到此这篇关于MySQL查询优化必备知识点的文章就介绍到这了,更多相关MySQL查询优化内容请搜索小牛知识库以前的文章或继续浏览下面的相关文章希望大家以后多多支持小牛知识库!
前言 本人接触Android已经6、7年了,见证了Android的爆火,也经历了互联网的寒冬。 如今,行业逐渐沉淀与成熟,对Android开发人员的要求也越来越高。深耕互联网领域多年,我不断学习知识、提升技术,向更高的山峰攀登,而在这过程中,我遇到了很多问题,也有许多大厂面试的经历。 之前遇到疑难问题时,我总会在网上搜索答案,各位大牛的无私分享帮助我良多,由此表示衷心感谢!现在细想了一下,自己也是
本文向大家介绍MySQL优化中B树索引知识点总结,包括了MySQL优化中B树索引知识点总结的使用技巧和注意事项,需要的朋友参考一下 为什么要进行SQL优化呢?很显然,当我们去写sql语句时: 1会发现性能低 2.执行时间太长, 3.或等待时间太长 4.sql语句欠佳,以及我们索引失效 5.服务器参数设置不合理 SQL语句执行过程分析 1.编写过程: 编写过程就是我们平常写sql语句的过程,也可以理
本文向大家介绍javaScript知识点总结(必看篇),包括了javaScript知识点总结(必看篇)的使用技巧和注意事项,需要的朋友参考一下 1、javaScript的概念:是一种表述语言,也是一种基于对象(Object)和事件驱动(EventDriven)的,安全性好的脚本语言,运行在客户端,从而减轻服务器端的负担,总结如下: 1.javaScript主要用来向HTML页面找那个添加交互行
本文向大家介绍jQuery基础知识点总结(必看),包括了jQuery基础知识点总结(必看)的使用技巧和注意事项,需要的朋友参考一下 jQuery是一个优秀的、轻量级的js库 ,它兼容CSS3,还兼容各种浏览器(IE 6.0+, FF1.5+, Safari 2.0+, Opera 9.0+),而jQuery2.0及后续版本将不再支持IE6/7/8浏览器。jQuery使用户能更方便地处理HTML(标
本文向大家介绍Mysql基础知识点汇总,包括了Mysql基础知识点汇总的使用技巧和注意事项,需要的朋友参考一下 1.什么是SQL语句 sql语言:结构化的查询语言。(Structured Query Language),是关系数据库管理系统的标准语言。 它是一种解释语言:写一句执行一句,不需要整体编译执行。 语法特点: 1.没有“ ”,字符串使用‘ '包含 2.没有逻辑相等,赋值和逻辑相等都是=
本文向大家介绍Mysql连接join查询原理知识点,包括了Mysql连接join查询原理知识点的使用技巧和注意事项,需要的朋友参考一下 Mysql连接(join)查询 1、基本概念 将两个表的每一行,以“两两横向对接”的方式,所得到的所有行的结果。 假设: 表A有n1行,m1列; 表B有n2行,m2列; 则表A和表B“对接”之后,就会有: n1*n2行; m1+m2列。 2、则他们对接(连接)之后