目录
- MySQL查询花费的IO次数
- 千万级条数B+树高度为3的表与几十万级B+树高度为3的表的查询效率比较
- 普通索引和唯一索引的查询效率比较?
MySQL查询花费的IO次数
首先说明:查询数据库时,不论读一行,还是读多行,都是将这些行所在的整页数据加载,然后在内存中匹配过滤出最终结果。即一次页加载就是一次IO。
- 通过聚簇索引查找记录最多需要花费多少次IO?
- 通过二级索引查找记录最多需要花费多少次IO?
我们先说通过二级索引进行查找时需要花费的IO次数:
首先,从二级索引B+树中,根据name找到对应的主键id
然后,再根据主键id 从 聚簇索引查找到对应的记录。如果二级索引有3层,聚簇索引有3层,那么最多花费的IO次数是:3+3 = 6
聚簇索引默认是主键,如果表中没有定义主键,InnoDB 会选择一个唯一的非空索引代替。如果没有这样的索引,InnoDB 会隐式定义一个主键来作为聚簇索引。
这也是为什么InnoDB表必须有主键,并且推荐使用整型的自增主键!!!
InnoDB使用的是聚簇索引,将主键组织到一棵B+树中,而行数据就储存在叶子节点上
举例说明:
设一个表有id、name两个属性,其中id是主键。
1、若使用"where id = 14"这样的条件查找记录,因为id是主键,就可以走索引B+树,即可查找到对应的叶节点,之后获得行数据。
2、若对Name列进行条件搜索,则需要两个步骤:
第一步在辅助索引B+树中检索Name,到达其叶子节点获取对应的主键值。
第二步使用主键值在主索引B+树中再执行一次B+树检索操作,最终到达叶子节点即可获取整行数据。(重点在于通过其他键需要建立辅助索引)
千万级条数B+树高度为3的表与几十万级B+树高度为3的表的查询效率比较
查询数据库时,不论读一行,还是读多行,都是将这些行所在的整页数据加载,然后在内存中匹配过滤出最终结果。表的检索速度跟树的深度有直接关系,毕竟一次页加载就是一次IO,而磁盘IO又是比较费时间。对于一张千万级条数B+树高度为3的表与几十万级B+树高度也为3的表,其实查询效率相差不大。
普通索引和唯一索引的查询效率比较?
唯一索引就是在普通索引上增加了约束性,也就是关键字唯一,找到了关键字就停止检索。而普通索引,可能会存在用户记录中的关键字相同的情况,根据页结构的原理,当我们读取一条记录的时候,不是单独将这条记录从磁盘中读出去,而是将这个记录所在的页全部加载到内存中进行读取。InnoDB 存储引擎的页大小为 16KB,在一个页中可能存储着上千个记录,因此在普通索引的字段上进行查找也就是在内存中多几次判断下一条记录的操作,对于 CPU 来说,这些操作所消耗的时间是可以忽略的。
参考链接:
面试题:mysql 一棵 B+ 树能存多少条数据?
















