MYSQL:索引

索引

一个排序的数据结构,用来协助提升查询效率。InnoDB中是B+树。

Page

InnoDB中存储数据的最小逻辑单位,一个页16KB,存储多个行。
一个节点上就是一个页的大小,页的数据在节点中。加载节点的次数越多,I/O寻址的次数越多。B+树矮胖 减少了寻址次数。

B+树和B树区别

  • 关键字数和分叉相等,B树是关键字=分叉-1(存储的关键字少一个)
  • B+树非叶子节点不存储数据(能容纳更多的关键字,更矮胖),查找性能更均衡
  • B+树叶子节点连成了链表,更利于范围查询

B+树的叶子节点是一个个页,先找到页的地址后,具体的数据在页中查找。

自适应哈希索引

为热点页自动创建哈希索引,提升访问效率。无法显示创建哈希索引。

聚簇索引

索引的键值的逻辑顺序和表数据行的物理存储顺序是一致的。
主键索引 = 聚簇索引。因为实际数据是按主键顺序创建的。
InnoDB的表一定会有主键,没有指定主键会用不为null 的UNIQUE key创建,假如这种key也不存在,会用隐藏的row_id当主键。

如何建立索引

  • 列的区分度必须要高
  • 联合索引最左匹配规则
  • 联合索引把区分度高的放前面
  • 过长字段建立前缀索引
  • 负向查询(<>,not in)可能会被优化,从而用到索引

覆盖索引

直接在辅助索引查询到所需要的数据,不用去主键索引再次查询(回表),就叫覆盖索引,效率很高。

索引条件下推(默认开启)

假如过滤条件可以在索引中进行,那么直接在索引中过滤。
索引的过滤在存储引擎中进行。
数据的过滤在服务端进行。

为什么不建议用无序字段建立索引

无序字段插入很容易插入到现有索引页的某个位置,这时候不得不移动元素,从而产生额外的开销。

原文地址:https://www.cnblogs.com/fcb-it/p/13369722.html