Mysql主键索引时间复杂度_MySQL之索引系列(一)

本文介绍了常见的数据库索引模型,包括哈希表、有序数组和N叉树,详细讲解了它们的优缺点。特别讨论了InnoDB的B+树索引模型,区分了主键索引和非主键索引,以及回表的概念。通过实例解释了如何根据主键和二级索引进行查询操作。
摘要由CSDN通过智能技术生成

常见索引模型

数据库的索引模型有很多种,其中比较常见、简单的数据结构是哈希、有序数组和搜索树

哈希表

哈希表是一种key-value结构的数据结构,key为待查找的值,用一个hash函数计算key的哈希值,作为存储位置,value就放在这个位置,因为多个key可能计算出来hash值相同,即占用相同的位置,所以value可以是一个链表,里面存着多个值。

AAffA0nNPuCLAAAAAElFTkSuQmCC

image

如图,根据用户id计算hash值,可能user2、user5两个用户计算出来的hash值相同,所以他们的数据以链表的形式存在于value。如果要获取user6的信息,根据 hash(user6.id) 得出hash值为3,则在3这个value中遍历,获取user6的信息。    一个好的hash函数计算得到的值应该是非常分散的,不容易重复,这样会减少遍历的过程,增加查询速度。

由于hash存储位置的值不是递增的,而是散列的,因此插入数据时速度是很快的,但是如果要查找区间内的值 [user3,user9],只能挨个从user3开始遍历查找,所以hash表这种结构适合于等值查询的场景,不适合区间查询

有序数组

有序数组对于上述区间查询这一场景有优势,存储状态如图:

AAffA0nNPuCLAAAAAElFTkSuQmCC

image

按照id递增存储在数组中,如果需要查询某个id对应的姓名,根据二分法时间复杂度为O(log n),如果需要查询一个区间的范围,则开头第一个user后一次往后查询即可。但是如果需要大量插入数据,数据结构就不适合了,为了保证id的顺序性,需要往数组中间插入一条,则该id后面的数据一次向后移动,成本比较高。

以上可见,有序数组索引只适用于静态存储引擎,提供查询、不插入的数据表

N叉树

二叉树的特点:每个节点比左儿子大,比右儿子小。由结构可知时间复杂度为O(log n),为了维持这种结构,更新的时间复杂度同样是O(log n)。除了二叉树外还可以有N叉树,对于二叉树来说,100万节点的树高20,也就是说查找一个数据很有可能要访问20个数据块,这个速度就会很慢。所以这时候应该使用N叉树,N取决于数据块的大小。N叉树由于在读写上的性能优点,以及适配磁盘的访问模式,已经被广泛的应用在数据库引擎中了

InnoDB的索引模型

innoDB使用了B+树索引模型,每个索引都对应着一棵B+树。

索引类型分为:主键索引和费主键索引

主键索引叶子节点存的是整行数据,也被称为聚簇索引;非主键索引的叶子节点内容是主键的值,也被称为二级索引。

也就是说如果通过主键id来查找,则只需要搜索id这棵B+树

如果使用二级索引来查找,则先找到该二级索引对应的主键id然后再根据id索引树在搜索一次,这个过程叫做回表

如图:

AAffA0nNPuCLAAAAAElFTkSuQmCC

image

select * from table where k = 3

以上SQL使用了二级索引K,首先搜索索引树,得到主键id的值为300,再到主键索引树找到300对应的数据,这一过程叫做回表

作者:瑜戈

链接:https://www.jianshu.com/p/21a17937c1ed

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值