加入收藏 | 设为首页 | 会员中心 | 我要投稿 武陵站长网 (https://www.50888.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

Mysql索引简单介绍

发布时间:2022-11-06 15:32:21 所属栏目:MySql教程 来源:转载
导读: 索引用于快速找出在某个列中有一特定值的行。不使用索引,MySQL必须从第1条记录开始然后读完整个表直到找出相关的行。
表越大,花费的时间越多。如果表中查询的列有一个索引,MySQL能快速到

索引用于快速找出在某个列中有一特定值的行。不使用索引,MySQL必须从第1条记录开始然后读完整个表直到找出相关的行。

表越大,花费的时间越多。如果表中查询的列有一个索引,MySQL能快速到达一个位置去搜寻到数据文件的中间,没有必要看所有数据。

大多数MySQL索引(PRIMARY KEY、UNIQUE、INDEX和FULLTEXT)在B树中存储

2.我们着重聊一下B+树索引,如下图

mysql创建表索引_mysql表索引_mysql索引表

图中涉及两种类型的索引:聚簇索引、非聚簇索引

2.1聚簇索引:

一般就是主键索引,该索引中每个子节点都保持主键的范围值,叶子节点保存单行数据的所以字段,因此当我们利 用主键索引去检索一定可以检索到我们所需数据,不需要去其他地方获取值;

注意:每个表只能有一个聚簇索引

mysql表索引_mysql创建表索引_mysql索引表

2.2 非聚簇索引:

除主键索引以外的索引类型,和聚簇索引最大差异在于叶子节点保存的不是完整数据mysql索引表,而是某个非主键列和主键,非局促索引可能带来"回表",这里引入回表的概念,我们稍后介绍;

mysql索引表_mysql创建表索引_mysql表索引

2.3 我们具体说明回表:

假如我们table1表中有三个字段A,B,C,D 现在建立联合索引 index1(B,C)

当我们执行 select * fromtable1 where B=1 and C=1;这段执行之后无疑index1索引,但是需要返回的是*,也就是A,B,C,D,根据前面介绍,非聚簇索引叶子节点之后保存索引中的字段值和key,因此还需要根据key值去聚簇索引中查询A,D字段的值,此过程叫做回表;

回表带来的问题就是增加了检索的复杂度,也就带来时间上面的开销;

既然知道回表带来的额外开销,那我们如何尽量避免回表呢?下面引入覆盖索引的概念

2.4 覆盖索引

首先覆盖索引要尽量避免使用 select * 这个的检索语句,比如依旧使用上面的例子select * fromtable1 where B=1 and C=1;

这时候如果我们select B C fromtable1 where B=1 and C=1;这样检索的字段都包含在索引中,我们可以从叶子中找到字段数据,避免了回表过程(这只是一个栗子)

3 介绍完索引类型我们介绍下什么情况下索引生效或失效(开局一张图)

mysql创建表索引_mysql表索引_mysql索引表

首先介绍联合索引,我们要知道,联合索引遵循最左侧原则,也就是当建立A,B,C联合索引,能使用索引的条件

有A/AB/ABC(ABC可以是无序的,因为mysql会帮我们自动重排序);

根据上图其实A字段就是最上面的节点范围值,当检索完A之后才去检索B(步骤和A一样需要排序),之后是C,这样假设

检索的是AC,那将会只有A走了索引,B出现了断点,根据最左侧原则,C也不会再进行索引;

3.1结果分析

通过上面的例子我们分析如下查询语句( index1(B,C))

select B C fromtable1 where B=1 and C !=1;

分析:当我们执行语句过程中,B字段无疑可以进行索引,但是当走到C字段检索时,发现没有给出具体范围值,这样你让索引如何去检索,因此C字段无法执行索引;

再去通过上面的说明分析 !=,,is null,is not null这样的操作,都没有指出字段范围,怎么可能去走索引呢;

3.2.覆盖索引一般不会去全表扫描

在上述表达中,覆盖索引算是极端,即使index (a,b,c) where b = and c= 或者 where b =or c=

因为他会遍历覆盖索引的二级索引,不用去扫描聚集索引(但是索引效率不是很高)

mysql索引表_mysql表索引_mysql创建表索引

因此有些定义不能死记硬背,需要我们去理解掌握

(编辑:武陵站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!