索引是检索图书资料的一种工具,把书刊中的内容或项目分类摘录,注明页数,按必定次序排列。
针对不一样的数据存储结构有不一样的数据查找方式。mysql
B树又名平衡多路查找树,主要用于文件系统中,在B树中,每一个结点的大小为一个磁盘页,结点中所包含的关键字及其孩子的数目取决于页的大小。算法
对于一颗度为m的B树,须要知足:sql
每一个结点都要包含(n,Ao,K1,A1,K2,A2,K3,A3,Kn,An)缓存
B树使用二分查找,包含两个基本操做:数据结构
B树上关键字的增长和删除经过平衡算法达到平衡。函数
B+树是B树的变体,在实际的文件系统中基本上不使用B树。B+树和B树的差别点:工具
B+树的非叶子结点不保存数据记录的指针信息,这意味着深度相同时B+树比B树的关键字更多。性能
InnoDB中的主键索引和辅助索引都是采用B+树。spa
B树的每一个结点大小和磁盘页一致,磁盘每一个页有4k,根据这个咱们就能够计算出索引的深度。假设是一颗彻底的m阶B+树,m的大小取决于非叶子结点存储关键字的数量,主键通常都是BIGINT 占8个字节,那么m=4*1024/8=512。.net
辅助索引的关键字按索引建立时定义列的顺序来的,如:status + create_time,10 2020-8-1
B+树结点中的关键字都是按顺序组织的,因此关键字的长度和类型决定了索引的性能:
在某些特殊场景关键字的值不须要均匀,如:status字段有 一、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的功能,开发者并不能控制,尽管如此仍是要尽量的利用,若是性能没法知足再选择缓存中间件。
参考: