聚簇索引

数据库表的索引从数据存储方式上可以分为聚簇索引和非聚簇索引(又叫二级索引)两种。Innodb的聚簇索引在同一个B-Tree中保存了索引列和具体的数据,在聚簇索引中,实际的数据保存在叶子页中,中间的节点页保存指向下一层页面的指针。“聚簇”的意思是数据行被按照一定顺序一个个紧密地排列在一起存储。一个表只能有一个聚簇索引,因为在一个表中数据的存放方式只有一种。

一般来说,将通过主键作为聚簇索引的索引列,也就是通过主键聚集数据。下图展示了Innodb中聚簇索引的结构(图片来自《高性能MySQL(第三版)》):

聚簇索引的结构

这里要特别注意的概念,一个页可以理解为一块具有一定大小的连续的存储区域。相同页内的数据行在物理上是相邻的,因此逻辑上键值相邻的页在物理上可能相隔很远。

在中间的某个节点页中,主键<11的叶子页和11<主键<21的叶子页分别被两个指针所指向,且主键<11的叶子页也有一个指针指向了11<主键<21的叶子页,其余页之间的关系也是一样。

聚簇索引的优点

  1. 聚簇索引将索引和数据行保存在同一个B-Tree中,查询通过聚簇索引可以直接获取数据,相比非聚簇索引需要第二次查询(非覆盖索引的情况下)效率要高。
  2. 聚簇索引对于范围查询的效率很高,因为其数据是按照大小排列的,

聚簇索引的缺点

  1. 聚簇索引的更新代价比较高,如果更新了行的聚簇索引列,就需要将数据移动到相应的位置。这可能因为要插入的页已满而导致“页分裂”。
  2. 插入速度严重依赖于插入顺序,按照主键进行插入的速度是加载数据到Innodb中的最快方式。如果不是按照主键插入,最好在加载完成后使用OPTIMIZE TABLE命令重新组织一下表。
  3. 聚簇索引在插入新行和更新主键时,可能导致“页分裂”问题。
  4. 聚簇索引可能导致全表扫描速度变慢,因为可能需要加载物理上相隔较远的页到内存中(需要耗时的磁盘寻道操作)。

非聚簇索引

非聚簇索引,又叫二级索引。二级索引的叶子节点中保存的不是指向行的物理指针,而是行的主键值。当通过二级索引查找行,存储引擎需要在二级索引中找到相应的叶子节点,获得行的主键值,然后使用主键去聚簇索引中查找数据行,这需要两次B-Tree查找。

总结

下面是Innodb聚簇索引和非聚簇索引的示意图(图片来自《高性能MySQL(第三版)》:

Innodb聚簇索引和非聚簇索引

MySQL中Innodb的聚簇索引和非聚簇索引相关推荐

  1. 在mysql中建立聚簇索引_给我一分钟,让你彻底明白MySQL聚簇索引和非聚簇索引...

    推荐阅读:吊打面试官!MySQL灵魂100问,你能答出多少? MySQL的InnoDB索引数据结构是B+树,主键索引叶子节点的值存储的就是MySQL的数据行,普通索引的叶子节点的值存储的是主键值,这是 ...

  2. MySQL中的聚簇索引、非聚簇索引、联合索引和唯一索引

    一.索引类型 索引根据底层实现可分为B-Tree索引和哈希索引,大部分时候我们使用的都是B-Tree索引,因为它良好的性能和特性更适合于构建高并发系统. 根据索引的存储方式来划分,索引可以分为聚簇索引 ...

  3. mysql innodb 聚簇_MySQL InnoDB 聚簇索引和非聚簇索引

    每个 InnoDB 表都有一个称为 「 聚簇索引 」 的特殊索引,通常情况下,这个聚簇索引就是 「 主键 」( primary key ) .Innodb 使用它存储表中每一行的数据. 如果想要从 查 ...

  4. mysql 聚簇索引和非聚簇索引_聚簇索引和非聚簇索引

    聚簇索引并不是一种单独的索引类型,而是一种数据存储方式.具体细节依赖于其实现方式. MySQL数据库中innodb存储引擎,B+树索引可以分为聚簇索引(也称聚集索引,clustered index)和 ...

  5. mysql 聚簇索引和非聚簇索引_图文并茂,说说MySQL索引

    点击上方 小伟后端笔记 ,选择 星标 公众号 重磅资讯.干货,第一时间送达 作者:小小木的博客来源:cnblogs.com/wyc1994666/p/10831039.html 序 开门见山,直接上图 ...

  6. mysql 聚簇索引和非聚簇索引_MySQL 聚簇索引 二级索引 辅助索引(上两期中奖名单)...

    阅读文本大概需要3分钟. MySQL中每个表都有一个聚簇索引( clustered index ),除此之外的表上的每个非聚簇索引都是二级索引,又叫辅助索引( secondary indexes ). ...

  7. Mysql聚簇索引和非聚簇索引原理(数据库)

    一.'页'和操作系统的关系 ①为什么要有内存管理? 我们知道,一个进程完成他的功能,需要访问磁盘加载数据到内存然后等待进入cpu运算,因为数据量大小远远大于内存大小.因此提出虚拟内存概念.虚拟内存就是 ...

  8. mysql的聚簇索引和非聚簇索引

    mysql的聚簇索引和非聚簇索引 1.一个表中只能有一个索引吗? 可以按照需求来创建多个索引,但不要太多. 2.每一个索引是一棵B+树,还是所有的索引共用一棵B+树? 一个索引一棵B+树. 3.如果有 ...

  9. MySQL聚簇索引和非聚簇索引的原理及使用

    从数据结构角度 1.B+树索引 2.hash索引 3.FULLTEXT索引(InnoDB引擎5.7以后支持) 4.R-Tree索引(用于对GIS数据类型创建SPATIAL索引) 问题:这些索引的区别跟 ...

最新文章

  1. 中国AI专利申请量超美国,百度居国内首位
  2. [Unity热更新]04.卸载方式
  3. Hadoop平台安全机制Kerberos认证
  4. Python sys.stdout sys.stdin
  5. 33.Node.js 文件系统fs
  6. CJCMS系列---慢慢讲电子商务在项目中的实践之前言
  7. 一些非常有用的链接和工具
  8. 网络技巧:想要WiFi信号满格,路由器应该这样放!
  9. python下sqlite增删查改方法(转)
  10. 使用PHREAK算法实现Drools 6性能
  11. QNetworkRequest 请求类
  12. [vue] vue使用v-for遍历对象时,是按什么顺序遍历的?如何保证顺序?
  13. 华为服务器euleros系统,euleros服务器版本
  14. 从零开始编写深度学习库(二)FullyconnecteLayer CPU编写
  15. 使用DataX同步MaxCompute数据到TableStore(原OTS)优化指南
  16. 强悍的命令行 —— echo、env($PATH)、sudo
  17. python后端数据发送到前端_python后端开发使用flask接收前端数据,处理后返回结果...
  18. 数据采集程序(网页小偷)点滴心得
  19. PPT中如何插入页码和母版修改
  20. opencv-python实际演练(二)军棋自动裁判(4)棋子图像提取算法的改进

热门文章

  1. 线性内插interp1函数用法
  2. 数字图像处理(4): 遥感影像中 光谱分辨率、空间分辨率、时间分辨率、全色图像、多光谱图像、高光谱图像 的区别
  3. 吴恩达机器学习ex2:逻辑回归
  4. 韩顺平java-枚举和注解异常包装类
  5. 一个新手学着重装系统之路
  6. 20154322杨钦涵 Exp6 信息搜集与漏洞扫描
  7. Linux下Mysql启动、关闭、重启指令
  8. 生成和查看dump文件
  9. cmd md命令 创建文件夹
  10. ZooKeeper原理和实践