1. MySQL索引数据结构以及各自特点
-
二叉树
左子节点小于父节点,右子节点大等于父节点。当索引为已排序数据时,导致二叉树变成了链表,查找复杂度为N
每个节点只存储一个记录,数据量大时树高度比较大,查找困难;每个节点只存储一个记录,导致一次查询有可能多次磁盘
-
红黑树
自平衡二叉查找树。左右子树的高度相差较大时,自动旋转平衡,树的高度相对于二叉树小一点 -
Hash表
优点在于:在确定值的情况下,对于读写定位都很快缺点在于:区间范围查找困难,比如
>
,<
,between
等,order by和group by也很困难 -
B-Tree
一个节点包含多个索引,这样树的高度可控。节点大小有限制;可通过show global status like 'innodb_page_size';
查看节点的大小,一般为16KB。 -
B+Tree
叶子节点从左到右递增。B+Tree中叶子节点增加了指针连接,在范围查找时非常方便,比如选取大于30的记录,顺着叶子节点向右的指针就可以查找出所有符合的记录,而不用再从根节点一次遍历查找
2. MySQL数据表存储引擎
-
InnoDB存储引擎
InnoDB存储引擎存储的表主键索引的叶子节点存储的数据记录本身,索引和数据都在B+Tree上,为聚集索引类型。数据是以索引的结构组织在一起的,所以InnoDB存储引擎的表必须要有主键,如果没有显示的设置主键,系统自动选取一个具有唯一值的列作为主键,选不到时创建一个辅助的具有唯一值的列作为主键进行自动维护。
整型的自增型主键好处在于,第一整型存储较小,第二在于数据的插入和查询效率较高
非聚集类索引叶子节点数据部分存储的是主键,所以使用非聚集索引检索数据时需要查找两次,先在当前索引树上找到主键,再通过主键在主键聚集索引树上找到对应的数据记录
-
MyISAM存储引擎
MyISAM存储引擎存储的表叶子节点存储的数据是对应的记录的磁盘地址,索引文件和数据文件分离,为非聚集索引类型
3. 聚集索引和非聚集索引
-
聚集索引
数据存储在索引树上。索引的逻辑顺序和数据的物理顺序一致一张表只能有一个聚集索引。InnoDB将主键与数据聚集在一起的方式,使得按主键顺序的插入和查询效率会很高,更新主键或者不按主键的顺序插入数据的代价会比较高
-
非聚集索引
数据不存储在索引树上,只存储数据的指向指针。索引的逻辑顺序和数据的物理顺序不同一张表可有多个非聚集索引,叶子节点数据部分存储对应的主键值
-
使用场景
动作描述 | 使用聚集索引 | 使用非聚集索引 |
---|---|---|
列经常被分组排序 | 应 | 应 |
返回某范围内的数据 | 应 | 不应 |
一个或极少不同值 | 不应 | 不应 |
小数目的不同值 | 应 | 不应 |
大数目的不同值 | 不应 | 应 |
频繁更新的列 | 不应 | 应 |
外键列 | 应 | 应 |
主键列 | 应 | 应 |
频繁修改索引列 | 不应 | 应 |
4. 联合索引
-
概述
1、两个或更多个列上的索引被称作联合索引,联合索引又叫复合索引。2、对于复合索引:MySQL从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分。例如索引是key index (a,b,c). 可以支持a | a,b| a,b,c 3种组合进行查找,但不支持 b,c进行查找 . a,c组合也可以,但实际上只用到了a的索引,c并没有用到! 当最左侧字段是常量引用时,索引就十分有效。where条件中and的顺序MySQL会自动调整,所以and的顺序不一定非要按照abc的顺序
-
规则
1、 需要加索引的字段,要在where条件中
2、数据量少的字段不需要加索引
3、如果where条件中是OR关系,加索引不起作用(InnoDB存储引擎)
4、符合最左原则,使用最频繁的一列放在最左边
5、列中包含有NULL值都将不会被包含在索引中,复合索引中只要有一列含有NULL值,那么这一列对于此复合索引就是无效的。所以我们在数据库设计时不要让字段的默认值为NULL
6、联合索引比对每个列分别建索引更有优势,因为索引建立得越多就越占磁盘空间,在更新数据的时候速度会更慢
5. Explain查看索引使用情况
-
explain结果个字段表述的意义请参考
https://www.cnblogs.com/DreamDrive/p/7752960.html -
key_len是一个很重要的参数,它的长度可以计算出当前SQL语句使用了哪些索引,计算方法请参考
https://www.cnblogs.com/xuanzhi201111/p/4554769.html
MySQL索引专题可参考(高大全)
https://www.cnblogs.com/softidea/archive/2016/08/29/5816497.html