MySQL之索引系列(一)

索引能够提升数据查询的效率,至关于一本书的目录html

常见索引模型

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

哈希表

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


如图,根据用户id计算hash值,可能user二、user5两个用户计算出来的hash值相同,因此他们的数据以链表的形式存在于value。若是要获取user6的信息,根据 hash( user6.id) 得出hash值为3,则在3这个value中遍历,获取user6的信息。 一个好的hash函数计算获得的值应该是很是分散的,不容易重复,这样会减小遍历的过程,增长查询速度。
因为hash存储位置的值不是递增的,而是散列的,所以插入数据时速度是很快的,可是若是要查找区间内的值 [user3,user9],只能挨个从user3开始遍历查找,因此hash表这种结构适合于等值查询的场景,不适合区间查询

有序数组

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


按照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索引树在搜索一次,这个过程叫作回表
如图:性能

select * from table where k = 3学习

以上SQL使用了二级索引K,首先搜索索引树,获得主键id的值为300,再到主键索引树找到300对应的数据,这一过程叫作回表 所以在应用中减量使用主键索,能够减小回表过程cdn

索引维护

因为B+树的有序性,因此在插入新数据时须要调整,维持结构。 在自增主键的状况下,主键系统本身动获取主键id,按顺序在最后插入一个叶子节点,是追加操做,不须要移动其余的记录。
使用业务逻辑字段作主键,则通常不能保证有序插入,写数据的成本比较高
上文可知,非主键索引的叶子节点都是主键的值,若是主键长度越大,普通索引的叶子节点就越小,普通索引占用的空间也就越小 从性能和存储空间两方面考虑,自增主键每每是更合理的选择htm

本文为极客时间《MySQL实战45讲》的学习笔记,其中含有部分原文,若有侵权行为请联系我马上删除
第一节:一条SQL查询语句的执行过程blog

相关文章
相关标签/搜索