引用:https://www.cnblogs.com/boothsun/p/8480909.html
1、索引原则:
- 最左匹配前缀原则,联合索引
- 如果确定有多少条数据,使用 limit 限制一下,MySQL在查找到对应条数的数据的时候,会停止继续查找
- join 语法,尽量将小的表放在前面,在需要on的字段上,数据类型保持一致,并设置对应的索引,否则MySQL无法使用索引来join查询
- 尽量选择区分度高的列作为索引
- 索引列不能参与计算,保持列“干净”
- 尽量的扩展索引,不要新建索引
- 用or分割条件,若or前后只要有一个列没有索引,就都不会用索引
2、为什么是最左匹配前缀原则?
索引是有序的,多列索引是先按照第一列进行排序,然后在第一列排好序的基础上再对第二列排序,如果没有第一列的话,直接访问第二列,那第二列肯定是无序的,直接访问后面的列就用不到索引了。
3、在最左匹配原则中,有如下说明:
- 最左前缀匹配原则,mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配,比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到,a,b,d的顺序可以任意调整。
- =和in可以乱序,比如a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意顺序,mysql的查询优化器会帮你优化成索引可以识别的形式
4、MySQL执行过程、执行计划和优化
(1) 客户端发送一条查询给服务器
(2) 服务器会先检查查询缓存,如果命中了缓存,则立即返回。否则进入下一阶段
(3) 服务器端进行SQL解析、预处理,然后再有查询优化器生成对应的执行计划。MySQL解析是对mysql的语法规则进行验证,预处理器是根据mysql的一些规则进行进一步的检查解析树是否合法,主要是检查数据库表和数据列是否存在等。MySQl是基于成本的的优化器,它将尝试预测一个查询使用某种执行计划的成本,并选择其中成本最小的一个。
(4) Mysql根据查询优化器生成的执行计划,调用存储引擎来执行查询,一般是innodb
(5) 将查询结果返回给客户端