索引
一个排序的数据结构,用来协助提升查询效率。InnoDB中是B+树。
Page
InnoDB中存储数据的最小逻辑单位,一个页16KB,存储多个行。
一个节点上就是一个页的大小,页的数据在节点中。加载节点的次数越多,I/O寻址的次数越多。B+树矮胖 减少了寻址次数。
B+树和B树区别
- 关键字数和分叉相等,B树是关键字=分叉-1(存储的关键字少一个)
- B+树非叶子节点不存储数据(能容纳更多的关键字,更矮胖),查找性能更均衡
- B+树叶子节点连成了链表,更利于范围查询
B+树的叶子节点是一个个页,先找到页的地址后,具体的数据在页中查找。
自适应哈希索引
为热点页自动创建哈希索引,提升访问效率。无法显示创建哈希索引。
聚簇索引
索引的键值的逻辑顺序和表数据行的物理存储顺序是一致的。
主键索引 = 聚簇索引。因为实际数据是按主键顺序创建的。
InnoDB的表一定会有主键,没有指定主键会用不为null 的UNIQUE key创建,假如这种key也不存在,会用隐藏的row_id当主键。
如何建立索引
- 列的区分度必须要高
- 联合索引最左匹配规则
- 联合索引把区分度高的放前面
- 过长字段建立前缀索引
- 负向查询(<>,not in)可能会被优化,从而用到索引
覆盖索引
直接在辅助索引查询到所需要的数据,不用去主键索引再次查询(回表),就叫覆盖索引,效率很高。
索引条件下推(默认开启)
假如过滤条件可以在索引中进行,那么直接在索引中过滤。
索引的过滤在存储引擎中进行。
数据的过滤在服务端进行。
为什么不建议用无序字段建立索引
无序字段插入很容易插入到现有索引页的某个位置,这时候不得不移动元素,从而产生额外的开销。