原文地址:《聚簇索引和二级索引》,增加部分补充和理解。

目录​​​​​

1、索引的简述

(1)聚簇索引

(2)非聚簇索引

二级索引(辅助索引)

2、示例

聚簇索引(主键索引)

二级索引(辅助索引)

3、结论

结论一

结论二


------------------------------------------------------------------------————————————————————————————————-

写在前面,针对原博主的讲述,网友提出相应补充,需要注意:

聚簇索引(Clustered indexes)是指索引和数据是在同一个结构里;非聚簇索引(Non-clustered indexes)反之。对于InnoDB和MyISAM引擎中的索引,都分为主键索引(primary key)和二级索引(secondary index);在InnoDb中,强制使用主键作为聚簇索引,B+ Tree叶子节点存储就是主键数据,而二级索引的叶子节点存储的是主键的键值;在MyISAM中,主键索引与二级索引没什么区别,都是存储的数据行对应的地址。一般把InnoDB作为聚簇索引的代表、MyISAM作为非聚簇索引的代表,两者进行比较,这就导致了矛盾点,如果将二级索引等价于非聚簇索引,那InnoDB就不能完全代表聚簇索引;但是单从二级索引的存储形式来看,又属于非聚簇索引。

1、索引的简述

(1)聚簇索引和非聚簇索引

聚簇索引:

索引和数据存储在一块( 都存储在同一个B*tree 中)。一般主键索引都是聚餐索引。

非聚簇索引:

索引数据和存储数据是分离的。

(2)主键索引和二级索引

对于InnoDB和MyISAM引擎中的索引,都分为主键索引(primary key)和二级索引(secondary index);
在InnoDb中,强制使用主键作为聚簇索引,B+ Tree叶子节点存储就是主键数据,而二级索引是非聚簇的,其叶子节点存储的是主键的键值;
在MyISAM中,主键索引与二级索引没什么区别,都是采用非聚簇,都是存储的数据行对应的地址。

2、示例

下面我们通过一个具体的示例进行演示聚集索引和二级索引

pl_ranking(编程语言排行榜表)

该表包含3个字段,如下:
id:主键
plname:编程语言名称
ranking:排名

id: 设置主键
plname: 普通索引

聚簇索引(主键索引)

从图中我们可以看到,索引数据和存储数据都是在一颗树上,存在一起的。通过定位索引就直接可以查找到数据。

这棵树是根据主键进行创建的。
如果查找id=16的编程语言,
select id, plname, ranking from pl_ranking where id=16;
则只需要读取3个磁盘块,就可以获取到数据。

二级索引(辅助索引)

从上图中我们发现,该B*tree根据plname列进行构建的,只存储索引数据,plname 和 id 的映射。

比如查找 编程语言为“Java”的数据。
select id, plname, ranking from pl_ranking where plname='Java';
首先通过二级索引树中找到 Java 对应的主键id 为 “16”(读取2个磁盘块)。
然后在去主键索引中查找id为“16” 的数据。(读取3个磁盘块)

3、结论

select id, plname, ranking from pl_ranking where id=16;
根据主键查找只需要查找3个磁盘块
select id, plname, ranking from pl_ranking where plname='Java';
根据编程语言名称查询需要读取5个磁盘块

结论一

通过上面的主键索引和非主键索引的例子我们可以得出:
主键索引(聚餐索引)查询效率比非主键索引查询效率更高。如果能使用主键查找的,就尽量使用主键索引进行查找。

结论二

从上面图中我们还可以分析得出以下结论:
主键定义的长度越小,二级索引的大小就越小,这样每个磁盘块存储的索引数据越多,查询效率就越高。

Mysql 的 聚簇索引和二级索引相关推荐

  1. MySQL中B+树索引,聚簇索引,二级索引,辅助索引,回表,索引生效条件

    对于MySQL,我们经常说调优有一个手段就是加索引,那么为什么加索引能够优化查询,是不是加了索引查询就快了 ? 在MySQL中,存储的单元并不是按照我们理解的一条一条记录,而是按照页来进行存储的,My ...

  2. 简述聚簇索引、二级索引、索引下推

    目录 1.聚簇索引 2.二级索引(辅助索引) 3.回表 4.索引下推(CIP) 1.聚簇索引 InnoDB索引分为两种: 聚簇索引: 一般建表时的主键就会被mysql作为聚簇索引,如果没有主键则选择非 ...

  3. mysql 聚簇索引 和聚簇索引 (二级索引)的 那些事

    mysql的聚簇索引是指innodb引擎的特性,mysiam并没有,如果需要该索引,只要将索引指定为主键(primary key)就可以了. 比如: [sql] view plaincopy crea ...

  4. mysql innodb 二级索引,mysql InnoDB index 主键采用聚簇索引,二级索引不采用聚簇索引...

    我的归纳: (1)InnoDB的主键采用聚簇索引存储,使用的是B+Tree作为索引结构,但是叶子节点存储的是索引值和数据本身(注意和MyISAM的不同). (2)InnoDB的二级索引不使用聚蔟索引, ...

  5. mysql 聚簇索引 和聚簇索引 (二级索引)的 那些事

    mysql的聚簇索引是指innodb引擎的特性,mysiam并没有,如果需要该索引,只要将索引指定为主键(primary key)就可以了. 比如: create table blog_user (u ...

  6. MySQL聚簇索引和二级索引的区别

    主键索引的叶子节点存的是整行数据.在InnoDB里,主键索引也被称为聚簇索引(clustered index). 非主键索引的叶子节点内容是主键的值.在InnoDB里,非主键索引也被称为二级索引(se ...

  7. MySQL-索引的分类(聚簇索引、二级索引、联合索引)

    文章目录 索引的分类 聚簇索引 二级索引(辅助索引.非聚簇索引) 联合索引 联合索引的使用(B+树索引的适用情况) B+树的形成过程 索引注意事项 总结 在InnoDB中索引分为好几种类型,下面我们一 ...

  8. MySQL InnoDB聚簇索引和普通索引浅析

    聚簇索引 Innodb的存储引擎表是索引组织表,聚簇索引就是一种索引组织表的一种形式,索引键值的逻辑顺序决定了表数据行的物理顺序. 聚簇索引叶子节点存放所有行的数据记录信息,即数据即索引,索引即数据. ...

  9. 【mysql】聚簇索引(聚集索引)和非聚簇索引(二级索引、辅助索引)的区别

    文章目录 总结 1. 聚簇索引 一个坑 2. 非聚簇索引 3. 二级索引 总结 聚簇索引也叫聚集索引.,并不是一种单独的索引类型,而是一种数据存储方式.那么可以理解聚簇索引是一种抽象概念,在具体实现的 ...

最新文章

  1. 百度地图JavaScript API自定义覆盖物、自定义信息窗口增删时的显示问题
  2. UICollectionView(一)基本概念
  3. MySQL 报错 1055
  4. 玩美自由行体验报告 | 手摸手产品研究院
  5. python5数据存储
  6. 小学计算机技术指导纲要,《中小学信息技术课程指导纲要(试行)》
  7. Django 的简单ajax
  8. 阿里云视频云「 vPaaS 」演绎了怎样的音视频应用开发「未来图景」
  9. bzoj 4278 Tasowanie 后缀数组+贪心
  10. fatal: HttpRequestException encountered (附:网盘下载地址)
  11. Win7磁盘清理怎么操作?十步让你学会
  12. word另存为pdf后,pdf文件中有空白页
  13. js: color-thief在浏览器中拾取图片的主色调
  14. 用户特殊权限SUID,SGID, SBIT理解学习
  15. Jpress项目学习纪录片(一) -- 环境搭建
  16. windows10和linux流畅,《古墓丽影10:崛起》Linux平台与Windows平台流畅度对比
  17. 微信小程序页面界面元素自适应
  18. sap增加税码注意事项
  19. httpd服务及配置文件详解
  20. 用GO语言编写一个简单的区块链

热门文章

  1. Git++ - 有趣的命令
  2. velocity模板 If / ElseIf / Else语法
  3. CHROME开发者工具的小技巧
  4. Javascript - Select操作大集合
  5. LaTeX 笔记:NFSS 那点事儿
  6. Word无法打开该文件,因为文件格式与文件扩展名不匹配的解决办法
  7. 《Docker——容器与容器云》:第五章 构建自己的容器云
  8. C++之父元旦专访(8+13个问题,关于C++的学习使用和未来)
  9. 从简历筛选看怎么写一篇有亮点的简历
  10. Rancher upgrade webhook之CI/CD