mysql性能调优:建立索引的原理

一个最重要的原则是最左前缀原理,在提这个之前要先说下联合索引,MySQL中的索引可以以一定顺序引用多个列,这种索引叫做联合索引,一般的,一个联合索引是一个有序元组,其中各个元素均为数据表的一列。另外,单列索引可以看成联合索引元素数为1的特例。
  索引匹配的最左原则具体是说,假如索引列分别为A,B,C,顺序也是A,B,C:
  那么查询的时候,如果查询【A】【A,B】【A,B,C】,那么可以通过索引查询
  如果查询的时候,采用【A,C】,那么C这个虽然是索引,但是由于中间缺失了B,因此C这个索引是用不到的,只能用到A索引
  如果查询的时候,采用【B】【B,C】【C】,由于没有用到第一列索引,不是最左前缀,那么后面的索引也是用不到了
  如果查询的时候,采用范围查询,并且是最左前缀,也就是第一列索引,那么可以用到索引,但是范围后面的列无法用到索引
  尽管索引可以加快查询速度,但是索引也有代价:索引文件本身会占用存储空间,并且索引将增加插入,删除和修改记录的负担。另外,MySQL在运行时还会消耗资源来维护索引。所以索引不是越多越好
  当使用InnoDB存储引擎时,如果没有特殊需要,请始终使用与业务无关的自动递增字段作为主键。从数据库索引优化的角度来看,使用InnoDB引擎而不是自动增加主键绝对不是一个好主意。
  InnoDB使用聚集索引,数据记录本身存储在主索引(B树)的叶节点上。这就要求在同一叶子节点(内存页或磁盘页的大小)中的数据记录按主键的顺序存储,因此,每当插入新记录时,MySQL就会根据以下内容将其插入相应的节点中:它的主键和位置,如果页面达到负载因子(InnoDB默认为15/16),则将打开一个新页面(节点)。如果表使用自动递增的主键,则每次插入新记录时,该记录将被顺序添加到当前索引节点的后续位置。页面满时,将自动打开一个新页面。如下:
  在这里插入图片描述

这样就会形成一个紧凑的索引结构,近似顺序填满。由于每次插入时也不需要移动已有数据,因此效率很高,也不会增加很多开销在维护索引上。
  如果使用非自增主键(如果身份证号或学号等),由于每次插入主键的值近似于随机,因此每次新纪录都要被插到现有索引页得中间某个位置,如下:
  在这里插入图片描述

此时MySQL不得不为了将新记录插到合适位置而移动数据,甚至目标页面可能已经被回写到磁盘上而从缓存中清掉,此时又要从磁盘上读回来,这增加了很多开销,同时频繁的移动、分页操作造成了大量的碎片,得到了不够紧凑的索引结构,后续不得不通过OPTIMIZETABLE来重建表并优化填充页面。
  因此,只要可以,请尽量在InnoDB上采用自增字段做主键。
  推荐阅读:mysql性能调优:B+Tree的基本介绍
  如果你想了解更多关于java架构师的专业知识,可以加入JAVA架构师交流群:1037935907,里面都是同行,有资源分享包括但不限于(分布式架构、高可扩展、高性能、高并 发、Jvm性能调优、Spring,MyBatis,Nginx源码分析,Redis,ActiveMQ、、Mycat、Netty、Kafka、Mysql 、Zookeeper、Tomcat、Docker、Dubbo、Nginx)。欢迎一到五年的工程师加入,合理利用自己每一分每一秒的时间来学习提升自己,不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代!

猜你喜欢

转载自blog.csdn.net/weixin_49698883/article/details/111362490