ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

(03)索引

2022-01-23 23:33:21  阅读:122  来源: 互联网

标签:03 非聚 name 聚簇 10% 索引 主键


1. 概念

索引底层存储用的B+树

一张表中有2个索引,那就会有2个B+树。(索引就是B+树存储的,可以理解为索引就是B+树)

什么是B+树?参考连接
https://cloud.tencent.com/developer/article/1681803

特殊情况:mysql的 memery 存储引擎使用的是hash表存储,而不是B+树。InnoDB、MyISAM
的索引结构是 B+树索引

注意:使用索引时,尽可能的使用长度较小的列

2. 索引分类

2.1. 主键索引

建表时,mysql会自动为主键创建索引。主键索引属于特殊的唯一索引,不能为空值,且每张表只能有一个主键索引

2.2. 唯一索引

ALTER TABLE table_name ADD UNIQUE (column)

唯一索引允许空值,一张表中可以有多个唯一索引

1.主键一定是唯一性索引,唯一性索引并不一定就是主键;
2.一个表中可以有多个唯一性索引,但只能有一个主键;
3.主键列不允许空值,而唯一性索引列允许空值;

2.3. 组合索引

ALTER TABLE table_name ADD INDEX index_name (column1,column2,...)

使用组合索引时,需要注意组合索引的顺序

2.3.1. 案例

建立组合索引(a,b,c)
ALTER TABLE table_name ADD INDEX index_name (a,b,c)

执行上边sql语句,相当于建立了a、ab、abc三个索引
一个索引顶三个索引是好事。如果不使用联合索引,而是单独建立3个索引,那么每多一个索引都会增加写操作的开销和磁盘空间的开销

会存在覆盖索引。有如下sql
select a,b,c from table where a=1and b = 2。
那么MySQL可以直接通过遍历索引取得数据,而无需回表查询,这减少了很多的随机io操作

组合索引匹配越多,筛选数据越快。
假设一张表中,有1000w条数据,a=1的数据占10%,b=2的数据占10%,c=3的数据占10%

不使用联合索引,把a,b,c拆分为3个单独索引,有如下sql
select * from table where a = 1 and b =2 and c = 3。
检索次数为1000W*10%=100w ,然后再回表从100w条数据中找到符合b=2 and c= 3的数据。

使用联合索引,(a,b,c)为一个整体。有如下sql
select * from table where a = 1 and b =2 and c = 3。
检索次数为1000w *10% *10% *10%=1w

3. 聚簇索引/二级索引/非聚簇索引

聚簇索引/二级索引/非聚簇索引 不是单独的索引类型,而是一种数据存储方式

3.1. 聚簇索引

InnoDB主键id索引类型为聚簇索引

聚簇索引就是把InnoDB引擎表的主键构造一颗B+树,同时叶子节点(最底层节点)中存放的就是整张表的行记录数据
说白了聚簇索引的叶子节点存放的是主键值+数据行

假设user表id为主键,数据库类型为InnoDB,那么建表时MySql会自动为主键id创建聚簇索引,如下图

3.2. 二级索引

聚簇索引的叶子节点存放的是主键值+数据行,二级索引的叶子节点存放的是索引值+主键值

如果我手动创建一个普通索引ALTER TABLE user ADD INDEX in_name (name),那么name这个索引的数据结构如下图

3.3. 非聚簇索引

MyISAM主键id索引类型为非聚簇索引

非聚簇索引就是把MyISAM引擎表的主键构造一颗B+树,非聚簇索引将数据与索引分开存储,索引结构的叶子节点指向了数据对应的位置
说白了非聚簇索引的叶子节点存放的是主键值+数据行所在地址

假设user表id为主键,数据库类型为MyISAM,那么建表时MySql会自动为主键id创建非聚簇索引,如下图

标签:03,非聚,name,聚簇,10%,索引,主键
来源: https://www.cnblogs.com/luchaoguan/p/15837833.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有