索引是检索图书资料的一种工具,把书刊中的内容或项目分类摘录,注明页数,按一定次序排列。
针对不同的数据存储结构有不同的数据查找方式。
B树又名平衡多路查找树,主要用于文件系统中,在B树中,每个结点的大小为一个磁盘页,结点中所包含的关键字及其孩子的数目取决于页的大小。
image.png
对于一颗度为m的B树,需要满足:
B树使用二分查找,包含两个基本操作:
B树上关键字的增加和删除通过平衡算法达到平衡。
B+树是B树的变体,在实际的文件系统中基本上不使用B树。B+树和B树的差异点:
image.png
B+树的非叶子结点不保存数据记录的指针信息,这意味着深度相同时B+树比B树的关键字更多。
InnoDB中的主键索引和辅助索引都是采用B+树。
image.png
B树的每个结点大小和磁盘页一致,磁盘每个页有4k,根据这个我们就可以计算出索引的深度。假设是一颗完全的m阶B+树,m的大小取决于非叶子结点存储关键字的数量,主键一般都是BIGINT 占8个字节,那么m=4*1024/8=512。
辅助索引的关键字按索引创建时定义列的顺序来的,如:status + create_time,10 2020-8-1
image.png
B+树结点中的关键字都是按顺序组织的,所以关键字的长度和类型决定了索引的性能:
在某些特殊场景关键字的值不需要均匀,如:status字段有 1、2这两个值,1 -> 100条数据,2 -> 100万条数据,业务上只需要查询status为1的记录就会非常快,否则需要扫全表。
了解InnoDB索引的查找方法有助于我们创建高效的索引:
InnoDB中的哈希函数使用除留余数法,冲突采用链地址法。
哈希是一种非常快的查找方法,时间复杂度为O(1),即只需要查询一次就能定位数据,而B+树的查找次数取决于树的高度。InnoDB存储引擎会监控对表上各索引页的查询。如果观察到建立哈希 索引可以带来速度提升,则建立哈希索引,称之为自适应哈希索引 (Adaptive Hash Index,AHI)。AHI是通过缓冲池的B+树页构造而来,因此建立的速度很快,而且不需要对整张表构建哈希索引。InnoDB存储引擎会自动根据访问的频率和模式来自动地为某些热点页 建立哈希索引。
AHI有一个要求,即对这个页的连续访问模式必须是一样的。例如对 于(a,b)这样的联合索引页,其访问模式可以是以下情况。
模式:
条件:
自适应hash索引是mysql的功能,开发者并不能控制,尽管如此还是要尽可能的利用,如果性能无法满足再选择缓存中间件。
参考:
领取专属 10元无门槛券
私享最新 技术干货