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 ...
随机推荐
- BZOJ2434[Noi2011]阿狸的打字机——AC自动机+dfs序+树状数组
题目描述 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机.打字机上只有28个按键,分别印有26个小写英文字母和'B'.'P'两个字母. 经阿狸研究发现,这个打字机是这样工作的: l 输入小 ...
- Uva1001-floyd算法-建图
给出一些球,球内的时间为零,球之间的速度为10每单位. 给两个点,求最短时间. 把每一个球当做点,球间的距离就是floyd的d数组.之后跑一遍floyd wa了两发因为d数组定义成int了 #incl ...
- HDU - 1160 (FatMouse's Speed )最长上升子序列
题意:一个元素有两个属性 w 和 sp 求在w严格递增的情况下 sp严格递减 用结构体 定义三个参数 w sp ix , ix是在输入时的顺序 因为我们要排序 之后把结构体数组 按从小到大排序 ...
- shell 一
1.shell是什么 shell是一种脚本语言 可以使用逻辑判断.循环等语法 可以自定义函数 shell是系统命令的集合 shell脚本可以实现自动化运维,能大大增加我们的运维效率 2.shell脚本 ...
- 开源工作流程引擎ccflow多人待办处理模式的详解
多人待办工作处理模式,也是待办处理模式.是当接受的节点是多个人的时候,如何处理待办? 根据不用的场景,ccbpm把多人在普通节点下的处理模式分为如下几种. 抢办模式: A发送到B ,B节点上有n个人可 ...
- 【BZOJ3821/UOJ46】玄学(二进制分组,线段树)
[BZOJ3821/UOJ46]玄学(二进制分组,线段树) 题面 BZOJ UOJ 题解 呜,很好的题目啊QwQ. 离线做法大概可以线段树分治,或者直接点记录左右两次操作时的结果,两个除一下就可以直接 ...
- How to Add Trust Sites into IE before IE10 through Group Policy
Due to IE10 published, I'll conclude the methods that how to add trust sites in to IE of the version ...
- cf500E New Year Domino (倍增)
先用线段树处理出推倒某一个后能覆盖到的最右端的位置R(绝对不能是最右边的那个骨牌,因为有可能右面的很短,左面的巨长(R不随L单调),后面算花费又需要用到这个位置),之后可以花费R到第一个比R大的左端点 ...
- java匹配竖线的错误警示
String s1 = "|"; // 输出 | System.out.println(s1); String s2 = s1.replaceAll("|",& ...
- 【java】详解native方法的使用
目录结构: contents structure [+] 关于native关键字 使用native关键字 使用步骤 案例 编写.java文件 编译.java文件 获得.h文件 编写hello.cpp文 ...