mysql 原理~ index的详解
一 简介:今天咱们来介绍下index的一些东西
二 数据的基本存储结构
1 磁盘空间被划分为许多大小相同的块(Block) 在内存中读出是页(Page)。
2 一个表的这些数据块以链表的方式串联在一起。
3 数据是以行(Row)为单位一行一行的存放在磁盘上的块中,在内存中一页至少存储2行(16KB的情况下)
4 在访问数据时,一次从磁盘中读出或者写入至少一个完整的Block/Page。
磁盘示意
block=>(row,row,row)
block=>(row,row)
block=>(row)
三 对于DML操作的具体精准解释
select
1 定位数据
2 读出数据所在的块,对数据加工(运算排序等操作)
3 返回数据给用户
UPDATE、DELETE
1 定位数据
2 读出数据所在的块,修改数据
3 写回磁盘
索引操作
delete
1 在Clustered B+Tree上删除一条记录。
2 在所有Secondary B+Tree上删除二级索引的记录。
update
非主键列
1 在Clustered B+Tree上更新数据。
主键列
1 Clustered B+Tree删除原有的记录(只是标记为DELETED,并不真正删除)。
2 在Clustered B+Tree插入一条新的记录。
3 在每一个Secondary B+Tree上删除原有的记录。(有疑问,看下一节。)
4 在每一个Secondary B+Tree上插入一个条新的记录。
更新键列时,需要更新多个页,效率比较低。
A. 尽量不用对主键列进行UPDATE操作。
B. 更新很多时,尽量少建索引。
INSERT
1 定位数据要插入的页(如果数据需要排序)
2 读出要插入的数据页,插入数据.
3 写回磁盘
四 簇聚索引

特点:
1 一个表只能有一个Clustered Index,因为数据只能根据一个键排序.叶子节点通过链表来进行连接
2 聚簇索引中的每个叶子节点包含主键值、事务ID、回滚指针(rollback pointer用于事务和MVCC)和余下的列值,非叶子节点包含主键和指向叶子节点的指针
3 用其他的键来建立索引树时,必须要先建立一个dense索引层,在dense索引层上对此键的值进行排序。这样的索引树称作Secondary Index. 一个表上可以有多个Secondary Index,并且每个辅助索引维护一个单独的B-TREE树,里面包含辅助索引的值和对应的主键
每次DML操作大多都会维护相关树,这是为什么不能一张表拥有太多索引的原因,会加大维护成本
4 对簇索引进行遍历,实际上就是对数据进行遍历。因此簇索引的遍历效率比辅助索引低。如SELECT COUNT(*) 操作,查询优化器一般会选择使用辅助索引遍历的效率更高。
五 查询顺序
1 用主键查询
直接在Clustered B+Tree上查询。
2 用辅助索引查询
1 在Secondary B+Tree上查询到主键。
2 用主键在Clustered B+Tree上查询到数据。
六 在InnoDB表中按照主键顺序插入行
1 主键的值时顺序的,索引InnoDB 把每一条记录都存储在上一条记录的后面。当达到页的最大填充因子时(InnoDB 默认的最大填充因子是页大小的15/16 ,留出部分空间用于以后修改),下一条记录就会写入到新的页中。一旦数据按照这种顺序的方式加载,主键页就会近似于被顺序的记录填满,这也正是所期望的结果
2 非自增ID主键顺序的插入
因为新的行的主键值不一定比之前插入的大,所以InnoDB 无法简单的总是把新行插入到索引的最后,写入是乱序的,InnoDB 不得不频繁的做分页操作,以便为新的行分配空间。页分裂会导致移动大量数据,一次插入最少需要修改三个页面,而不是一个页。由于频繁的页分裂,页会变得稀疏,并且被不规则的填充,所以最终数据会有碎片。
mysql 原理~ index的详解的更多相关文章
- MySQL性能分析, mysql explain执行计划详解
MySQL性能分析 MySQL性能分析及explain用法的知识是本文我们主要要介绍的内容,接下来就让我们通过一些实际的例子来介绍这一过程,希望能够对您有所帮助. 1.使用explain语句去查看分析 ...
- PHP mysql与mysqli事务详解
官方对PHP连接到MySQL数据库服务器的三种主要的API简介如下: http://php.net/manual/zh/mysqli.overview.php PHP mysql与mysqli事务详解 ...
- mysql配置文件my.cnf详解
原文地址:mysql配置文件my.cnf详解 作者:gron basedir = path 使用给定目录作为根目录(安装目录). character-sets-dir = path 给出存放着字符集的 ...
- MySQL 执行计划explain详解
MySQL 执行计划explain详解 2015-08-10 13:56:27 分类: MySQL explain命令是查看查询优化器如何决定执行查询的主要方法.这个功能有局限性,并不总会说出真相,但 ...
- mysql学习3:mysql之my.cnf详解
mysql之my.cnf详解 本文转自:https://www.cnblogs.com/panwenbin-logs/p/8360703.html 以下是 my.cnf 配置文件参数解释: #*** ...
- MySQL权限授权认证详解
MySQL权限授权认证详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.MySQL权限系统介绍1>.权限系统的作用是授予来自某个主机的某个用户可以查询.插入.修改.删除 ...
- DeepLearning tutorial(3)MLP多层感知机原理简介+代码详解
本文介绍多层感知机算法,特别是详细解读其代码实现,基于python theano,代码来自:Multilayer Perceptron,如果你想详细了解多层感知机算法,可以参考:UFLDL教程,或者参 ...
- MySQL之SQL优化详解(二)
目录 MySQL之SQL优化详解(二) 1. SQL的执行顺序 1.1 手写顺序 1.2 机读顺序 2. 七种join 3. 索引 3.1 索引初探 3.2 索引分类 3.3 建与不建 4. 性能分析 ...
- MySQL 语句执行过程详解
MySQL 原理篇 MySQL 索引机制 MySQL 体系结构及存储引擎 MySQL 语句执行过程详解 MySQL 执行计划详解 MySQL InnoDB 缓冲池 MySQL InnoDB 事务 My ...
随机推荐
- 13函数式编程&Stream流
13.1常用的函数式接口总结 接口名称 方法名称 抽象/默认 延迟/终结 方法描述 Supplier get 抽象 终结 供给型接口,无参有返回值,主要用于 Consumer accept 抽象 ...
- 【Linux】memcache和memcached的自动安装
赶时间所以写一个简单的一个脚本,没有优化,想优化的可以学习下shell,自己优化下. 且行且珍惜,源码包+脚本领取处 链接:https://pan.baidu.com/s/1wIFR1wY-luDKs ...
- 码云平台IDEA系列的插件使用
一.IDEA插件安装 file -- setting -- Plugins -- 搜索gitee -- Search in repositories 安装后重启编译器 二.登录并拉取项目 file ...
- MT【47】求一道分式的最值
评:技巧性很大,需要敏锐的洞察力通过柯西不等式把分母变成一样.请记住这个变形$$(a+b+ab+1)=(a+1)(b+1)\le\sqrt{(a^2+1)(b^2+1)}$$
- 06 自学Aruba之win7系统802.1x认证网卡设置指导
点击返回:自学Aruba之路 06 自学Aruba之win7系统802.1x认证网卡设置指导 步骤1.在桌面任务栏找到“打开网络和共享中心”,点击进入: 步骤2.点击“管理无线网络”,进入无线网络配置 ...
- Linux 系统缓存机制学习
前言:本文为参考他人的文章,是一篇学习记录型博客.理解linux的系统缓存机制有助于理解elasticsearch实时更新的原理. 一.缓存机制 为了提高文件系统性能,内核利用一部分物理内存分配出缓冲 ...
- 洛谷P3953 逛公园
DP+图论大毒瘤. 推荐这个博客. 先跑两遍最短路,搞掉一些无用点. 然后选出最短路上的边,做拓扑排序. 然后每层DP. 具体看代码. 用到的数组较多,记得清空. #include <cstdi ...
- csp20160904解题报告
dijkstra+贪心 每次加一个到起始点(首都)距离最小的点. 然后加边,这个最小点必然通过一条边和已加入的某个点相连,在这个最小点与已加入的点相连的边中,选取最短的一条边加入. 证明如下: 前提: ...
- poj 2186 "Popular Cows"(强连通分量入门题)
传送门 参考资料: [1]:挑战程序设计竞赛 题意: 每头牛都想成为牛群中的红人. 给定N头牛的牛群和M个有序对(A, B),(A, B)表示牛A认为牛B是红人: 该关系具有传递性,所以如果牛A认为牛 ...
- JS中的数据类型和变量内存
1. JS中存在5种简单数据类型和1种复杂数据类型: 5种简单数据类型:Undefined, Null, Boolean, Number, String. 1种复杂数据类型:Object. 上面的5种 ...