8分钟带你深入了解MySQL是如何利用索

今日分享开始啦,请大家多多指教~

mysql索引结构:

mysql索引使用B+tree,为什么使用B+tree呢,首先,使用索引是为了加快查找的速度,B+tree的查找时间复杂度为log(n).那为什么不用o(1)的hashMap呢。mysql是有使用hashMap结构的hash索引的,但大部分情况下,我们使用的索引并不是hash索引,主要是hash索引这种结果在处理!=,,这种范围查询时,需要全表扫描,时间复杂度为o(n)。

为什么不使用Btree?BTree和B+Tree的区别是,B+Tree的非叶子结点只保存索引,不保存数据,这样一个节点保存的数据更多,树的高度更低,在读取索引时,可以省IO(其实,这里降低树高度基本没啥用,因为往往我们的Tree的每个节点的度都很大,BTree和B+Tree高度基本差不多)。

另一个主要的作用是,由于数据节点都在叶子结点上,而每个叶子结点又使用双向链表链接,这样,在处理范围查询时,只需要查定一个下界,然后在叶子结点上遍历即可,且天然有序。

主键索引和二级索引

以Innodb为例:主键索引是和数据文件放在一块的,即数据文件在叶子结点上。对于主键索引,找到了主键索引,主键索引对应的value即为数据row。而非主键索引被称为二级索引的原因是,非主键索引的value存放的是主键的值,我们在使用非主键索引查找时,需要先根据索引找到主键,然后根据主键去找数据row。

根据主键再去找数据row的过程称为回表。因为对于这样的索引,不直接和数据关联,所以称为二级索引。对于二级索引,如果我们查找的列,已经全部在索引列里了,这时候就不需要回表了,这种索引成为覆盖(covered)索引。

主键索引也叫聚簇索引,二级索引也叫非聚簇索引。

explain索引优化

当我们想对一个sql语句进行优化时,可以用explain查看当前sql的执行计划。对于explain的输出,几个重要的如下。

Type:

const:用主键匹配eq_ref:两个表join的时候,join的key是两个表的主键。这时候,对于前一个表的每一行,后一张表只需要扫描一行Onerowisreadfromthistableforeach


转载请注明:http://www.aierlanlan.com/rzgz/2141.html