MySQL中的索引

索引概述

索引是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构一某种方式引用数据结构,这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。

索引结构

MySQL的索引是在存储引擎层实现的,在不同的存储引擎中,索引的种类不同:

B+Tree索引(MySQL5.5版本后InnoDB引擎默认的索引):最常见的索引类型,大部分引擎都支持。

Hash索引:底层数据结构使用哈希表实现的,只有精确匹配索引列的查询才有效,不支持范围查询。

R-Tree(空间索引):空间索引是MyISAM引擎的一个特殊索引类型,主要用于地理空间数据结构,通常使用较少。

Full-text(全文索引):是一种通过建立倒排索引,快速匹配文档的方式。

下文所讨论的索引均是B+Tree索引

为什么InnoDB存储引擎默认使用的索引是B+树而不是二叉树、红黑树、B树呢?

先说二叉树(指二叉查找树)

1.二叉树因为每个节点最多只有两个孩子,所以当数据量比较大时,二叉树的整个高度会非常高,导致进行数据检索时,检索速度太慢,太消耗性能。

2.二叉树顺序插入时,在最坏的情况时会形成一个单链表,使得检索性能下降。

红黑树:

红黑树避免出现二叉查找树形成单链表的最坏情况(红黑树规则),但是并没有解决当数据量特别大时,红黑树的高度特别高,导致检索速度慢。

B树(可以与B+树比较着看):

每一个节点可以有多个孩子,避免了因为数据量过大而导致的树层级过深,检索变慢。

缺点:

1.B树的每一个节点除了会存储指针指向下一个节点,还存储了相应的数据,同时也会增加内存的消耗。

2.B树的叶子节点并没有像B+树一样形成一个双向循环链表,无法进行区间查询。

B+树(默认索引):

与B树不同的是:

1.非叶子节点没有存储数据只存储了指针(只有检索功能),降低了内存的消耗。

2.叶子节点形成了带有顺序的双向循环链表,支持了区间查询。

InnoDB引擎的索引分类

在InnoDB引擎中索引按数据的组织情况可以分为两种:

聚簇索引(聚集索引)和二级索引(辅助索引)

聚簇索引

索引B+树的每个叶子节点存储了对应的行数据(表中一行的数据),检索时根据主键找到对应的行数据,节点上的指针是表中的主键。

同时聚集索引是必须存在的,如果一张表中没有主键,InnoDB引擎会默认使用第一个唯一索引作为该表的聚集索引;若没有唯一索引,就会选择一个隐含字段作为聚集索引。

二级索引

索引B+树的叶子节点存储了表中的主键值,而节点上的指针是根据你创建索引指定的字段,当你执行一个SQL查询语句时,如果条件后的字段有你创建的索引,会在该二级索引中根据该字段查询出对应的主键值,然后在聚集索引中根据该主键值查询得到相应的数据,这个过程叫做回表。

经过回表的查询语句普遍查询效率较低因为经过了二级索引和聚集索引两次检索。

而如果条件根据主键直接查询,只需要在聚集索引中检索一次就可得到对应的数据,检索性能较高。

索引语法

索引使用

最左前缀法则

如果索引了多列,要满足最左前缀法则。最左前缀法则指的是查询从索引的最左列开始,并且不跳过索引中的列,如果跳跃了某一列,索引将部分失效(后面的字段失效)。

索引失效

索引设计原则

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值