当前位置: 首页 > 科技观察

文章解释的很清楚,MySQL中的二级索引

时间:2023-03-21 10:51:23 科技观察

主键索引是InnoDB存储引擎默认为我们创建的一组索引结构。我们表中的数据也是直接放在主键索引中作为叶子节点的数据页。但是在开发的过程中,我们往往会根据业务需要在不同的领域建立索引。这些索引是二级索引。今天我们就给大家讲讲所有二级索引的原理。比如你给name字段加了一个索引,当你插入数据的时候,就会重建一个B+树。B+树的叶子节点也是数据页,只是在这个数据页中放置了主键字段和名称字段。叶子节点的数据页的name值和主键索引一样,都是按大小排序的。同一数据页中name字段的值大于上一个数据页中name字段的值。name字段的B+树也会构建多层索引页,其中包含下一层的页码和name字段的最小值。就这样:图1二级索引假设你要根据name字段来查找数据,比如:select*fromuserwherename='xxx',这个过程和主键索引是一样的。从name索引的根节点开始查找,逐层查找,直到找到叶子节点,找到name字段值对应的主键值。但是此时叶子节点的数据页还没有所有的字段,所以需要根据主键在主键索引中查找。从主键索引的根节点找到叶子节点,就可以找到这一行数据的所有字段。这个过程被回调到表中。二级索引,可以为多个字段创建联合索引,比如name+age+sex,此时联合索引的原理和单个字段一样,只是放置了id+name+age在叶子节点+性别的数据页中,然后默认按姓名排序,姓名相同按年龄排序,年龄相同按性别排序。name+age+sex的每个索引页都包含下级节点的页码和最小的name+age+sex值。当你用name+age+sex来查找的时候,会走name+age+sex的联合索引树,然后回表查询。以上就是innoDB二级索引的原理。你觉得仅此而已吗?索引的优缺点随着我们不断往表中插入数据,我们也会不断往数据页中插入数据,然后当一个数据页写满时,就会拆分成多个数据页。这时候就需要索引页了。指向单个数据页。如果数据页太多,那么索引页中的数据页指针就会太多,索引页必然会满。这时候索引页也会被拆分成多个,进而形成更高层级的索引页。这个过程和主键索引是完全一样的,所以如果你理解了主键索引,二级索引也很简单。索引的好处是显而易见的。查找数据时不需要全表扫描,性能非常高。但该指数也有其缺点。如果使用不当,会产生副作用。首先,创建一个索引,它占用存储空间。我们每创建一个索引,MySQL都会创建一个B+树,而每一个B+树都会占用大量的磁盘空间,所以索引太多也会消耗磁盘空间。其次,当你增删改查的时候,每次都需要维护每个索引的数据顺序,因为每个B+树都要求页面按照值的大小排序,页面也是有序的。因此,如果不断地增删改查,就必须不断地拆分每个索引的数据页,并添加新的索引页。如果一张表的索引太多,增删改查的性能会比较差。因此,综合以上两个原因,我们不建议一张表的索引过多。联合索引查询原理之所以要讲联合索引的查询原理,是为了帮助读者更清楚地了解索引的工作原理。我们平时设计的索引,大部分都是联合索引。如果有索引KEY(class,name,course),则为学生的班级、姓名、学科名称创建一个联合索引。联合索引的示意图如下:每个数据页包含联合索引的三个字段值和主键值,数据页也是按照顺序排序的。先按班级值排序,如果相同则按学名排序,如果相同则按学科名排序,所以数据页按这三个词的值排序。数据页内部和数据页之间也是有序的。数据页内部形成一个单向链表,数据页内部形成一个双向链表。图中,索引页分别指向两个数据页,索引页存放数据页中最小的数据值。如果我们要执行语句:select*fromstudentwhereclass='1班'andstudent_name='张强'andcourse_name='数学'。查询时,先到索引页中查找多个数据页的最小值记录。这时候可以直接在索引页中基于二分查找的方式进行查找。首先根据类名找到class1的值对应的数据页可以直接定位到所在的数据页。图2找到索引页就可以找到索引指向的数据页。数据页里面是一个单向链表。您还可以基于二进制搜索进行搜索。先根据班级1的值查询,发现有几条数据在班级1,然后根据学生张强的名字查找,发现也有多条数据,并且然后根据主题名称进行搜索。很快定位到一条数据,对应图中id=127的数据。图3找到数据再回表根据主键id=127找到完整的字段。开始对主键索引进行二分查找,快速定位到各个层级的索引页,然后逐渐定位到id=127的数据,就可以得到所有字段的值了。以上过程就是联合索引的查找过程。对于联合索引,就是把每个字段一次装上,进行二分查找。首先定位到第一个字段对应的值所在的页面。如果第一个字段的值相同,则根据第二个字段的值查找,以此类推。找到最终数据。