MySQL中Innodb的聚簇索引和非聚簇索引
聚簇索引
数据库表的索引从数据存储方式上可以分为聚簇索引和非聚簇索引(又叫二级索引)两种。Innodb的聚簇索引在同一个B-Tree中保存了索引列和具体的数据,在聚簇索引中,实际的数据保存在叶子页中,中间的节点页保存指向下一层页面的指针。“聚簇”的意思是数据行被按照一定顺序一个个紧密地排列在一起存储。一个表只能有一个聚簇索引,因为在一个表中数据的存放方式只有一种。
一般来说,将通过主键作为聚簇索引的索引列,也就是通过主键聚集数据。下图展示了Innodb中聚簇索引的结构(图片来自《高性能MySQL(第三版)》):
聚簇索引的结构
这里要特别注意页
的概念,一个页可以理解为一块具有一定大小的连续的存储区域。相同页内的数据行在物理上是相邻的,因此逻辑上键值相邻的页在物理上可能相隔很远。
在中间的某个节点页中,主键<11的叶子页和11<主键<21的叶子页分别被两个指针所指向,且主键<11的叶子页也有一个指针指向了11<主键<21的叶子页,其余页之间的关系也是一样。
聚簇索引的优点
- 聚簇索引将索引和数据行保存在同一个B-Tree中,查询通过聚簇索引可以直接获取数据,相比非聚簇索引需要第二次查询(非覆盖索引的情况下)效率要高。
- 聚簇索引对于范围查询的效率很高,因为其数据是按照大小排列的,
聚簇索引的缺点
- 聚簇索引的更新代价比较高,如果更新了行的聚簇索引列,就需要将数据移动到相应的位置。这可能因为要插入的页已满而导致“页分裂”。
- 插入速度严重依赖于插入顺序,按照主键进行插入的速度是加载数据到Innodb中的最快方式。如果不是按照主键插入,最好在加载完成后使用
OPTIMIZE TABLE
命令重新组织一下表。 - 聚簇索引在插入新行和更新主键时,可能导致“页分裂”问题。
- 聚簇索引可能导致全表扫描速度变慢,因为可能需要加载物理上相隔较远的页到内存中(需要耗时的磁盘寻道操作)。
非聚簇索引
非聚簇索引,又叫二级索引。二级索引的叶子节点中保存的不是指向行的物理指针,而是行的主键值。当通过二级索引查找行,存储引擎需要在二级索引中找到相应的叶子节点,获得行的主键值,然后使用主键去聚簇索引中查找数据行,这需要两次B-Tree查找。
总结
下面是Innodb聚簇索引和非聚簇索引的示意图(图片来自《高性能MySQL(第三版)》:
Innodb聚簇索引和非聚簇索引
MySQL中Innodb的聚簇索引和非聚簇索引相关推荐
- 在mysql中建立聚簇索引_给我一分钟,让你彻底明白MySQL聚簇索引和非聚簇索引...
推荐阅读:吊打面试官!MySQL灵魂100问,你能答出多少? MySQL的InnoDB索引数据结构是B+树,主键索引叶子节点的值存储的就是MySQL的数据行,普通索引的叶子节点的值存储的是主键值,这是 ...
- MySQL中的聚簇索引、非聚簇索引、联合索引和唯一索引
一.索引类型 索引根据底层实现可分为B-Tree索引和哈希索引,大部分时候我们使用的都是B-Tree索引,因为它良好的性能和特性更适合于构建高并发系统. 根据索引的存储方式来划分,索引可以分为聚簇索引 ...
- mysql innodb 聚簇_MySQL InnoDB 聚簇索引和非聚簇索引
每个 InnoDB 表都有一个称为 「 聚簇索引 」 的特殊索引,通常情况下,这个聚簇索引就是 「 主键 」( primary key ) .Innodb 使用它存储表中每一行的数据. 如果想要从 查 ...
- mysql 聚簇索引和非聚簇索引_聚簇索引和非聚簇索引
聚簇索引并不是一种单独的索引类型,而是一种数据存储方式.具体细节依赖于其实现方式. MySQL数据库中innodb存储引擎,B+树索引可以分为聚簇索引(也称聚集索引,clustered index)和 ...
- mysql 聚簇索引和非聚簇索引_图文并茂,说说MySQL索引
点击上方 小伟后端笔记 ,选择 星标 公众号 重磅资讯.干货,第一时间送达 作者:小小木的博客来源:cnblogs.com/wyc1994666/p/10831039.html 序 开门见山,直接上图 ...
- mysql 聚簇索引和非聚簇索引_MySQL 聚簇索引 二级索引 辅助索引(上两期中奖名单)...
阅读文本大概需要3分钟. MySQL中每个表都有一个聚簇索引( clustered index ),除此之外的表上的每个非聚簇索引都是二级索引,又叫辅助索引( secondary indexes ). ...
- Mysql聚簇索引和非聚簇索引原理(数据库)
一.'页'和操作系统的关系 ①为什么要有内存管理? 我们知道,一个进程完成他的功能,需要访问磁盘加载数据到内存然后等待进入cpu运算,因为数据量大小远远大于内存大小.因此提出虚拟内存概念.虚拟内存就是 ...
- mysql的聚簇索引和非聚簇索引
mysql的聚簇索引和非聚簇索引 1.一个表中只能有一个索引吗? 可以按照需求来创建多个索引,但不要太多. 2.每一个索引是一棵B+树,还是所有的索引共用一棵B+树? 一个索引一棵B+树. 3.如果有 ...
- MySQL聚簇索引和非聚簇索引的原理及使用
从数据结构角度 1.B+树索引 2.hash索引 3.FULLTEXT索引(InnoDB引擎5.7以后支持) 4.R-Tree索引(用于对GIS数据类型创建SPATIAL索引) 问题:这些索引的区别跟 ...
最新文章
- 中国AI专利申请量超美国,百度居国内首位
- [Unity热更新]04.卸载方式
- Hadoop平台安全机制Kerberos认证
- Python sys.stdout sys.stdin
- 33.Node.js 文件系统fs
- CJCMS系列---慢慢讲电子商务在项目中的实践之前言
- 一些非常有用的链接和工具
- 网络技巧:想要WiFi信号满格,路由器应该这样放!
- python下sqlite增删查改方法(转)
- 使用PHREAK算法实现Drools 6性能
- QNetworkRequest 请求类
- [vue] vue使用v-for遍历对象时,是按什么顺序遍历的?如何保证顺序?
- 华为服务器euleros系统,euleros服务器版本
- 从零开始编写深度学习库(二)FullyconnecteLayer CPU编写
- 使用DataX同步MaxCompute数据到TableStore(原OTS)优化指南
- 强悍的命令行 —— echo、env($PATH)、sudo
- python后端数据发送到前端_python后端开发使用flask接收前端数据,处理后返回结果...
- 数据采集程序(网页小偷)点滴心得
- PPT中如何插入页码和母版修改
- opencv-python实际演练(二)军棋自动裁判(4)棋子图像提取算法的改进