一 简介:今天咱们来介绍下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的详解的更多相关文章

  1. MySQL性能分析, mysql explain执行计划详解

    MySQL性能分析 MySQL性能分析及explain用法的知识是本文我们主要要介绍的内容,接下来就让我们通过一些实际的例子来介绍这一过程,希望能够对您有所帮助. 1.使用explain语句去查看分析 ...

  2. PHP mysql与mysqli事务详解

    官方对PHP连接到MySQL数据库服务器的三种主要的API简介如下: http://php.net/manual/zh/mysqli.overview.php PHP mysql与mysqli事务详解 ...

  3. mysql配置文件my.cnf详解

    原文地址:mysql配置文件my.cnf详解 作者:gron basedir = path 使用给定目录作为根目录(安装目录). character-sets-dir = path 给出存放着字符集的 ...

  4. MySQL 执行计划explain详解

    MySQL 执行计划explain详解 2015-08-10 13:56:27 分类: MySQL explain命令是查看查询优化器如何决定执行查询的主要方法.这个功能有局限性,并不总会说出真相,但 ...

  5. mysql学习3:mysql之my.cnf详解

    mysql之my.cnf详解 本文转自:https://www.cnblogs.com/panwenbin-logs/p/8360703.html 以下是 my.cnf 配置文件参数解释: #*** ...

  6. MySQL权限授权认证详解

    MySQL权限授权认证详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.MySQL权限系统介绍1>.权限系统的作用是授予来自某个主机的某个用户可以查询.插入.修改.删除 ...

  7. DeepLearning tutorial(3)MLP多层感知机原理简介+代码详解

    本文介绍多层感知机算法,特别是详细解读其代码实现,基于python theano,代码来自:Multilayer Perceptron,如果你想详细了解多层感知机算法,可以参考:UFLDL教程,或者参 ...

  8. MySQL之SQL优化详解(二)

    目录 MySQL之SQL优化详解(二) 1. SQL的执行顺序 1.1 手写顺序 1.2 机读顺序 2. 七种join 3. 索引 3.1 索引初探 3.2 索引分类 3.3 建与不建 4. 性能分析 ...

  9. MySQL 语句执行过程详解

    MySQL 原理篇 MySQL 索引机制 MySQL 体系结构及存储引擎 MySQL 语句执行过程详解 MySQL 执行计划详解 MySQL InnoDB 缓冲池 MySQL InnoDB 事务 My ...

随机推荐

  1. BZOJ4386[POI2015]Wycieczki——矩阵乘法+倍增

    题目描述 给定一张n个点m条边的带权有向图,每条边的边权只可能是1,2,3中的一种.将所有可能的路径按路径长度排序,请输出第k小的路径的长度,注意路径不一定是简单路径,即可以重复走同一个点. 输入 第 ...

  2. npm指向淘宝源

    临时 npm --registry https://registry.npm.taobao.org install express1 持久 npm config set registry https: ...

  3. VMware下Mac系统自适应屏幕

    1.下载VMwareTool工具镜像 链接:https://pan.baidu.com/s/1gvXBdzrwYyOEl6yhJurUig 提取码:s1po 2.打开Mac系统,推出DVD 2.设置连 ...

  4. 传递闭包(例题POJ3660)

    概念: 传递一种关系,例如 a//b   b//c  则 a//c 从已知的初始关系中  推出最后所有对象之间的关系 初始时把所有有关系的标记为1 即a[i][j] = 1 然后用Floyd 推出最后 ...

  5. 洛谷 P1076 寻宝 解题报告

    P1076 寻宝 题目描述 传说很遥远的藏宝楼顶层藏着诱人的宝藏.小明历尽千辛万苦终于找到传说中的这个藏宝楼,藏宝楼的门口竖着一个木板,上面写有几个大字:寻宝说明书.说明书的内容如下: 藏宝楼共有\( ...

  6. 端午漫谈(附:Ubuntu18.04下轻量截图软件)

    先说声端午快乐- 有空就陪陪家人吧.今天陪外公吃了顿饭,陪老人家聊了会天,颇有点感触.发现技术真的是改变生活,小孩抖音自学跳舞,大人微信刷又刷,很多天海一方的老朋友都可以联系到了... 其实最有感触的 ...

  7. 【洛谷P1463】反素数

    题目大意:给定 \(N < 2e9\),求不超过 N 的最大反素数. 题解: 引理1:不超过 2e9 的数的质因子分解中,最多有 10 个不同的质因子,且各个质因子的指数和不超过30. 引理2: ...

  8. [poj3046][Ant counting数蚂蚁]

    题目链接 http://noi.openjudge.cn/ch0206/9289/ 描述 Bessie was poking around the ant hill one day watching ...

  9. dedecms获取顶级栏目名称、二级栏目名称实现方法 转

    织梦DEDECMS文章.栏目页获取当前页面顶级栏目名称的方法 在用织梦做一些项目时,时常会碰到需要在当前页面调用顶级栏目名称的时候,织梦默认{dede:field name='typename' /} ...

  10. 当input获取倒焦点的时候,获得输入内容

    描述:当用户点击输入框时,获取到他在input里输入的内容 $().keyup(function(){ $(this).val(); }) $(this).val()==this.value; $(t ...