MySQL全面瓦解22:索引的介绍和原理分析
MySQL全面瓦解23:MySQL索引实现和使用
MySQL全面瓦解24:构建高性能索引(策略篇)
索引的十大原则1、正确理解和计算索引字段的区分度,文中有计算规则,区分度高的索引,可以快速得定位数据,区分度太低,无法有效的利用索引,可能需要扫描大量数据页,和不使用索引没什么差别。
2、正确理解和计算前缀索引的字段长度,文中有判断规则,合适的长度要保证高的区分度和最恰当的索引存储容量,只有达到最佳状态,才是保证高效率的索引。
3、联合索引注意最左匹配原则:必须按照从左到右的顺序匹配,MySQL会一直向右匹配索引直到遇到范围查询(>、<、between、like)然后停止匹配。
如 depno=1 and empname>'' and job=1 ,如果建立(depno,empname,job)顺序的索引,job是用不到索引的。
4、应需而取策略,查询记录的时候,不要一上来就使用*,只取需要的数据,可能的话尽量只利用索引覆盖,可以减少回表操作,提升效率。
5、正确判断是否使用联合索引(上面联合索引的使用那一小节有说明判断规则),也可以进一步分析到索引下推(IPC),减少回表操作,提升效率。
6、避免索引失效的原则:禁止对索引字段使用函数、运算符操作,会使索引失效。这是实际上就是需要保证索引所对应字段的”干净度“。
7、避免非必要的类型转换,字符串字段使用数值进行比较的时候会导致索引无效。
8、模糊查询'%value%'会使索引无效,变为全表扫描,因为无法判断扫描的区间,但是'value%'是可以有效利用索引。
9、索引覆盖排序字段,这样可以减少排序步骤,提升查询效率
10、尽量的扩展索引,非必要不新建索引。比如表中已经有a的索引,现在要加(a,b)的索引,那么只需要修改原来的索引即可。
查询优化分析器 - explainexplain命令大家应该很熟悉,具体用法和字段含义可以参考官网explain-output,这里需要强调rows是核心指标,绝大部分rows小的语句执行一定很快,因为扫描的内容基数小。
所以优化语句基本上都是在优化降低rows值。
慢查询优化基本步骤1.先运行查看实际耗时,判断是否真的很慢(注意设置SQL_NO_CACHE)。
2.高区分度优先策略:where条件单表查,锁定最小返回记录表的条件。
就是查询语句的where都应用到表中返回的记录数最小的表开始查起,单表每个字段分别查询,看哪个字段的区分度最高。区分度高的字段往前排。
3.explain查看执行计划,是否与1预期一致(从锁定记录较少的表开始查询)
4.order by limit 形式的sql语句让排序的表优先查
5.了解业务方的使用场景,根据使用场景适时调整。
6.加索引时参照建上面索引的十大原则
7.观察结果,不符合预期继续从第一步开始分析
查询案例分析下面几个例子详细解释了如何分析和优化慢查询。
复杂查询条件的分析一般来说我们编写SQL的方式是为了 是实现功能,在实现功能的基础上保证MySQL的执行效率也是非常重要的,这要求我们对MySQL的执行计划和索引规则有非常清晰的理解,分析下面的案例:
1 mysql> select a.*,b.depname,b.memo from emp a left join 2 dep b on a.depno = b.depno where sal>100 and a.empname like 'ab%' and a.depno=106 order by a.hiredate desc ; 3 +---------+---------+---------+---------+-----+---------------------+------+------+-------+------------+----------+ 4 | id | empno | empname | job | mgr | hiredate | sal | comn | depno | depname | memo | 5 +---------+---------+---------+---------+-----+---------------------+------+------+-------+------------+----------+ 6 | 4976754 | 4976754 | ABijwE | SALEMAN | 1 | 2021-01-23 16:46:24 | 2000 | 400 | 106 | kDpNWugzcQ | TYlrVEkm | 7 ...... 8 +---------+---------+---------+---------+-----+---------------------+------+------+-------+------------+----------+ 9 744 rows in set (4.958 sec)