要是针对其他字段建立索引,比如name、age之类的字段,这都是一样的原理,简单来说,插入数据的时候,一方面会把完整数据插入到聚簇索引的叶子节点的数据页里去,同时维护 好聚簇索引,另一方面会为其他字段建立的索引,重新再建立一颗B+树。比如基于name字段建立了一个索引,那么插入数据的时候,就会重新搞一颗B+树,B+树的叶 子节点也是数据页,但是这个数据页里仅仅放主键字段和name字段。也就是说,name字段的索引B+树里,叶子节点的数据页中的name值都是按大小排序的,同时下一个 数据页里的name字段值都大于上一个数据页里的name字段值,这个整体的排序规则都跟聚簇索引按照主键的排序规则是一样的。
普通字段建立索引 回表select *
针对select * from table where name='xx'这样的语句,先根据name字段值在name字段的索引B+树里找,找到叶子节点也仅仅可以找到对应的主键值,而找不到这行数据完整的所有字段。 所以此时还需要进行“回表”,这个回表,就是说还需要根据主键值,再到聚簇索引里从根节点开始,一 路找到叶子节点的数据页,定位到主键对应的完整数据行,此时才能把select *要的全部字段值都拿出来。
这种name的普通字段加索引就是secondary index也叫 二级索引,辅助索引,次索引,非主键索引,第二索引
联合索引
把多个字段联合起来,建立联合索引,比如name+age
联合索引的运行原理也是一样的,也是建立一颗独立的B+树,叶子节点的数据页里放了 id+name+age,然后默认按照name排序,name一样就按照age排序,不同数据页之间的name+age值的排序也如此。 然后这个name+age的联合索引的B+树的索引页里,放的就是下层节点的页号和最小的name+age+id的值,以此类推,所以当你根据name+age搜索的时候,就会走name+age联合索引的这颗B+树了,搜索到主键,再根据主键到聚簇索引里去搜索。
网站声明:如果转载,请联系本站管理员。否则一切后果自行承担。
加入交流群
请使用微信扫一扫!