一、mysql索引的结构
在学习数据结构的时候,始终绕不开一个概念-------二叉搜索树。这种数据结构本身排好序,因此查找起来很快。但是,不同于平常都是在内存里操作,一次操作不会十分的耗费性能,mysql是存放在磁盘中的,因此,当树的深度过大时候,那就会十分消耗性能了。因此mysql采用的是多叉,一个节点多个value的B+树。
mysql数据管理磁盘最小单位为数据页,一个数据页默认大小为16KB,而一个整形字段8B,还有B+树带有的指向其他子树的指针6b,因此一个数据页平均能保存1170个数据。当其有三层,数据量为十亿为单位。
而索引分为主键索引和非主键索引
1、主键索引又被称为聚簇索引,该索引的叶子节点保存的是数据列
2、非主键索引被称为二级索引,该索引叶子节点保存主键的值,需要通过主键值去主键索引查询数据,该操作被称之为回表。
这里要分析一下mysql的数据组织结构,一般聚簇索引B+树有三到四层,拿三层结构来说,在第一层和第二层保持的是(索引的范围),而第三层是叶子节点,其中保持的元素是索引具体值和数据,上面说的1170个数据就是第一层和第二层的索引容量。这里需要说明的是,当没主键的时候,mysql数据是怎么组织的呢。它会取第一个非空字段作为来构建,若没有,会自动生成。
二、非主键索引的使用
非主键索引保存的叶子节点里的元素包含的是主键id(聚簇索引),因此,当使用非主键索引查询的时候,会先查询该索引所在B+树,获取聚簇索引值,然后,使用聚簇索引去B+树查询数据。若所要查询的数据本身就是id或者二级索引的一部分(可能二级索引为组合索引),那么可以不需要回表,该索引又被称为覆盖索引。
三、最左前缀原则
该原则作用在联合索引和字符索引上,当使用联合索引的时候,必须要按照索引的组织顺序来写where的条件,而使用字符索引的时候,必须要从左边开始匹配字符,即左边精准查询,右边模糊查询。因为一个索引对应一颗B+树,在叶子节点的元素为索引的值,当条件不满足规定顺序的时候,那么B+树的原有排序也满足不了查询需求了。
在mysql5.6引入了一种新功能,前面一部分满足了最左前缀,但其后面的一部分不满足,而不满足的部分也在联合索引上,它会采用索引下推,也就是在回表之前,先判断那些不满足最左前缀的是否满足sql条件,只有满足条件,才回表,这样可以很好的减少回表的次数。