如果从一个页中,去查询记录,如果主键的为条件查询,可以二分法快速定位到对应的槽,然后在遍历该槽对应的记录,即可快速找到记录
如果不是主键,以其他列为条件查询,就无法通过二分法去查询,因为页中记录是以主键大小进行排序的,不是以其他列的大小进行排序的。
在很多页中查找,记录数据比较多,可能分布在多个页中,无论是以哪种条件进行查询,都无法定位到某个页,只从第一页开始遍历数据,如果表里面有1千多万,甚至过亿,查询效率就明显很低
为了解决以上问题,索引“同志” 就要闪亮登场
数据量多,不知道从那个页开始查询,我们建个目录不就是可以解决这个没问题了,目录里面有主键与页映射关系,根据主键就能找到那个页,然后再页中通过二分法进行快速到某个记录了,如果条件不是主键 是其他列,同理,建一个其他列与页的映射关系,那么建立映射,也称为目录,也就是我们所说的索引
这个图是为页编制的目录,也称为索引,特征:下一个数据页中用户记录的主键值一定大于上一个数据页中用户记录的主键值。如果下一个数据页中用户记录主键值小于上一个数据页中用户记录的主键值,那就进行调换位置,这个过程称为页分裂(所以为数据表建立主键最好递增,否则会造成页分裂,造成不必要性能消耗)
这个图,反着看,是不是像一棵树,其实这是一种数据结构,称为B+树
聚簇索引
使用记录主键值的大小进行记录和排序
B+树叶子节点存储的是完整的用户记录
这个聚簇索引不是我们手动创建的,是innoDB存储引擎自动为我们创建的。
二级索引
非主键,就是其他列创建的索引
无论我们创建多少索引,都是用的同一个索引树?
不是,这里就说明了,不是创建的索引越多越好,创建的索引越多,占用的空间也会越多
联合索引是怎么创建索引
假设有A列与B列设置为联合索引,先进行A列值进行排序,再以B列的值进行排序,它和只建立A列为索引是不一样的索引树,这是两回事,所以创建联合索引,注意一下
创建B列为二级索引,如果目录页 有两个目录项记录分别是 B列值1 、页号为3,B列值1 、页号为4
你再插入一条记录B列值1,这时就无法判断插入到哪一页,因为目录项记录只是B列值与页号,这时会添加一个主键在目录项记录中,就可以解决这个问题。修改成第一条记录是 B列值1 、主键 为2、页号为3,第二条记录是 B列值1 、主键 为7、页号为4.在B列值相等的话,就比较主键的大小,来判断插入的页号