- 索引的目的:
索引的出现其实就是为了提高数据查询的效率,就像书的目录一样。 - 常见索引模型:
hash表,以K-V键值对的形式的一种数据结构,底层是数组加链表形式。通过一定的hash运算找到数据合适的位置放入,如果放入的位置相同时,则拉出一个链表保存。
缺点就是,由于上图中的数据不是顺序排列的,所以查找的时候需要对数据进行遍历,造成了查询较慢的问题。
有序数组形式:顾名思义是有序的数组,这样可以使用二分查找去搜索,速度非常快。缺点是,当数组内数据变化时,需要挪动位置。这样的效率就很低,所以只适用于静态数据,一些不会再变化的数据。
二叉树:
在mysql中使用的是B+树,与B树的区别如下:
b+树的中间节点不保存数据,所以磁盘页能容纳更多节点元素,更“矮胖”;
b+树查询必须查找到叶子节点,b树只要匹配到即可不用管元素位置,因此b+树查找更稳定(并不慢);
对于范围查找来说,b+树只需遍历叶子节点链表即可,b树却需要重复地中序遍历
回表概念
每一个索引都是一颗B+树,索引分为普通索引,主键索引。
推荐使用主键索引,原因是主键索引不需要回表(详情?)回表导致查询效率降低的问题。
使用主键索引才能查询出完整表数据,非主键索引只能查出主键和对印的索引列数据。所以需要进行回表。
当然如果你要查询的列就是主键和索引列就不需要回表,直接可以查出来。这就是索引覆盖。
索引维护
插入或删除数据时,可能需要对B+树进行维护,涉及到数据页的分裂或合并。
当我们设置自动递增的主键索引时,这些增加的操作都是对B+树的追加,不会触发到叶子节点的分裂。
使用业务逻辑字段做主键时,往往不需要保证有序插入,遮掩的成本有点高。
主键长度越小,普通索引的叶子节点就越小,普通索引占用的空间也就越小。 尽量使用主键查询
总结:
- Innodb采用B+树结构,减少查询次数。
- 建议使用自增主键索引,这样可以减少普通索引的叶子节点大小,但是还是需要根据业务来进行分析。
- 没有主键innodb会自动创建一个主键RowId
问题:重建索引,重建主键索引?说出你的理解以及不合适的地方?为什么?
alter table T drop index k;
alter table T add index(k);
alter table T drop primary key;
alter table T add primary key(id);