索引
是数据库管理中的一个排序的数据结构,以协助快速查询和更新数据库表中的数据。
索引的数据结构和具体存储引擎的实现有关,在mysql中使用较多的索引有Hash索引、B+索引等。而我们经常使用的Innodb存储引擎的默认索引实现为B+索引。
索引是如何工作的?
首先明白为什么索引会增加速度。DB在执行一条sql语句的时候,默认方式是根据搜索条件进行全表扫描,遇到匹配条件的就会加入搜索集合,如果我们对某一字段增加索引,查询时就会先去索引列表中一次定位到特定值的行数,大大减少遍历匹配的次数,所以能明显增加查询速度。
索引数据结构类型
三种常见也比较简单的数据结构,他们分别是哈希表、有序数组、搜索树(B+)
索引的缺点
- 维护索引需要耗费数据库资源
- 索引需要占用磁盘空间
- 当对表的数据进行增删改的时候,因为要维护索引,速度会受影响。
索引分类
- 主键索引:设定主键后会自动建立索引,innodb为聚簇索引,主键索引列值不能为空。
- 普通索引:一个表中可以有多个单列索引。
- 唯一索引:索引列必须唯一,但允许有一个为null。
- 复合索引:一个索引中包含多个列。
- 最左前缀原则。
- 为了更好利用符合索引,在查询过程中会动态调整顺序。
B+树和B树的不同
- 非叶子节点只存储键值信息(主键、指针)。
- 所有叶子节点之间都有一个键指针。
- 数据记录都存放在叶子节点中。
Innodb中页的大小为16kb,一般主键int类型为4个字节,Bigint为8个字节,指针类型为4或8个字节。
描述索引
我们在放入数据时,会基于数据进行一个排序,排序后会将数据以链表的形式以一个指针把数据进行连接起来,同时mysql底层进一步优化的是基于B+数的结构进行存储,我们的数据进行一页一页的去存,默认也的大小是16kb,在整个B+树的结构来讲一个三层的B+数结构存储大概是8-10个亿左右,一般项目两层足以。