Mysql索引总结

一、索引分类

  1. Hash索引Hash 索引查询效率很高,时间复杂度O(1)。Mysql Innodb引擎不支持hash索引的。Hash索引适合精确查找,不适合范围查找

  2. 平衡二叉树时间复杂度为 O(n),根节点会变,数据量多,层次多,磁盘IO多

  3. B树每个节点中不仅包含数据的 key 值,还有 data 值。数据量较大的时候,同样会导致B树很深,从而增加了磁盘 IO 的次数。

  4. B+树所有的数据节点都在最后一层上,叶子节点按关键字排序,从左到右指针连接,层级更少,查询稳定。

 

二、主键索引

搜索过程:索引页 ——> 索引页 ——> 数据页

  • 索引页 + 数据页组成的B+树就是聚簇索引

  • InnoDB聚簇索引:

    1. 如果定义了PK,那么PK就是聚簇索引

    2. 没有PK,第一个not null unique就是聚簇索引

    3. 否则,自动建一个隐藏列作为聚簇索引。

  • 聚簇索引叶子节点储存整行数据(就是数据页);

  • 普通索引叶子节点:

    1. InnoDB储存主键索引

    2. MyIsam储存行记录的指针

 

三、回表与索引覆盖

  • 非聚簇索引(普通索引)中只保存了索引字段的值(按照顺序排列,联合索引先按第一列排序,再按第二列……排序,全都相同,再按主键索引排序)与主键索引的值

  • 回表:Select的where条件中是非聚簇索引,查询需要返回非聚簇索引中不包含的字段,此时需要用主键索引再查一次聚簇索引

  • 索引覆盖:将被查询的字段,建立到联合索引里去,这种查询不需要回表。

 

四、联合索引

  • 联合索引中多列条件为OR关联时,索引不生效

  • 最左边的列必须在查询条件中,不然不生效 —— 最左匹配原则;

  • 联合索引范围查询时,第一列是范围查询,后续的列再范围查询没法走索引的,只有第一列是等值查询时,后续的列才能用范围查询。

  • groupBy+索引,效率特别高,不需要建中间表,也不需要排序;

 

五、索引优化技巧

  • 大字段建索引时,可以只取字段的前半部分,例:

    CREATE INDEX table ON dual(address(20));

  • 某个值在某一列中出现比列很高时,查询优化器就会放弃索引,全表扫;比例分界线默认是30%

  • orderBy和groupBy后的字段最好建索引,不会产生中间表

  • 隐式类型(“1”=> 1)转换会导致索引失效

  • 深分页查询时使用Limit时,先嵌套子查询,把id查出来,再通过id用where条件搜索,可以避免回表;

posted on 2021-12-29 15:08  拉通对齐端到端  阅读(309)  评论(2编辑  收藏  举报

导航