MySql

2020年11月9日

14:06

MySql架构

2020年11月8日

20:19

从来没有思考过MySql的架构,了解了一下看来,MySql的架构是挺简洁的。

下图已经非常清楚,比较值得注意的就是存储引擎的选择,不通过存储引擎的设计不同,导致影响数据表存取的并发性能、存取方式。

此外,该架构中的典型设计。

  • 连接池,管理连接,由于这类连接通常是资源消耗较大的,而单一实例又完全不够用,所以一般是有一个连接池,可以看成空闲队列,资源池
  • 缓存,内存管理中典型的cache架构,适用于速度不匹配的设备之间的加速
  • 抽象与分层

索引

2020年11月9日

14:09

索引是一种优化查找速度的经典思想。索引本质上是一个精心设计的数据结构的目录,甚至可以说本质上就是一种数据结构。那么,问题是,索引这种数据结构为什么能够让查找速度变快呢?

我们来考虑一个日常的例子,索引无处不在,例如书和目录。

有没有想过,为什么目录能够快速查找?明明同样对应整本书,原因是目录压缩了信息,原本每一章的信息都是不一样长度,而在目录看来,每个章节都是一个相同的节点。

以上其实是索引的朴素思想,信息整理并压缩到一个目录中。我们会期望内存能够加载进一个目录,是我们能够快速定位所有数据。但事实上,当数据量变得非常大的时候,我们索引的节点数量也最终会大到同样尴尬的地步——只能放在硬盘上,查找索引本身太过耗时。

不难想到,线性结构组织索引的时间消耗为O(N),如果是利用树,那么我们可以期待O(logN)的时间消耗,考虑数据有序,那么平衡树可以做到,结合二分查找,两种方法可以加快搜索过程。

总结来说,索引之所以有用:

  • 信息压缩
  • 信息组织

B-Tree和B+Tree

2020年11月9日

14:06

B-Tree和B+Tree的特点是叶子节点非常大,而索引节点很小,这种特性被广泛用于IO相关的数据索引中——因为索引节点集中,方便加载进内存。

B-Tree

B-Tree是平衡二叉树的一种变种,它是一种多路平衡树。如下图,它看起来是非常好理解的,主要需要关注它的特点,以及插入删除的自平衡过程。

特点:

  1. 平衡二叉树节点最多有两个子树,而 B 树每个节点可以有多个子树,M 阶 B 树表示该树每个节点最多有 M 个子树
  2. 平衡二叉树每个节点只有一个数据和两个指向孩子的指针,而 B 树每个中间节点有 k-1 个关键字(可以理解为数据)和 k 个子树( **k 介于阶数 M 和 M/2 之间,M/2 向上取整)
  3. B 树的所有叶子节点都在同一层,并且叶子节点只有关键字,指向孩子的指针为 null

来自 <https://juejin.im/entry/6844903613915987975>

插入

无法插入gif比较可惜,自行去这个网站选择M=5,手动插入1-30的数据,应该就能非常好的获得intuition。

https://www.cs.usfca.edu/~galles/visualization/BTree.html

总体来说,B-Tree的插入的基本方式就是,上溢则分裂,递归执行。

ref: https://www.xuetangx.com/learn/THU08091002048/

删除

同上,还是去可视化网站上删除一个序列的节点,获得直观感受。事实上,平衡树的删除都比较复杂(操作细节多),但是并不难(理解后很简单)。本质上,所有平衡树的插入删除的核心操作都是:分裂,合并,协调兄弟父母节点。

删除操作是指,根据key删除记录,如果B树中的记录中不存对应key的记录,则删除失败。

1)如果当前需要删除的key位于非叶子结点上,则用后继key(这里的后继key均指后继记录的意思)覆盖要删除的key,然后在后继key所在的子支中删除该后继key。此时后继key一定位于叶子结点上,这个过程和二叉搜索树删除结点的方式类似。删除这个记录后执行第2步

2)该结点key个数大于等于Math.ceil(m/2)-1,结束删除操作,否则执行第3步。

3)如果兄弟结点key个数大于Math.ceil(m/2)-1,则父结点中的key下移到该结点,兄弟结点中的一个key上移,删除操作结束。

否则,将父结点中的key下移与当前结点及它的兄弟结点中的key合并,形成一个新的结点。原父结点中的key的两个孩子指针就变成了一个孩子指针,指向这个新结点。然后当前结点的指针指向父结点,重复上第2步。

有些结点它可能即有左兄弟,又有右兄弟,那么我们任意选择一个兄弟结点进行操作即可。

来自 <https://www.cnblogs.com/nullzx/p/8729425.html>

B+Tree

B-Tree有一个显而易见的缺点:索引节点中直接包含键值(数据),在数据量很多的情况下,会让索引节点变得更大,IO次数变多。于是B+Tree改进了B-Tree,让所有数据放到叶节点上。索引节点只做索引,不再保存数据。如图,同样非常直观。

B-Tree的插入和删除和B+树非常像,后者的删除要稍微复杂一些。同理。

https://www.cs.usfca.edu/~galles/visualization/BPlusTree.html

B+Tree直观的理解就是,将最后一行看作硬盘,而其他节点全在内存中——这就是索引的朴素形态。当然,事实是,索引节点无需一次加载。

Sql Explain性能分析工具

2020年11月9日

14:32

用法: Explain+SQL语句。

用于分析建立索引后SQL的性能分析。

select_type属性

select_type属性

含义

SIMPLE

简单的 select 查询,查询中不包含子查询或者UNION

PRIMARY

查询中若包含任何复杂的子部分,最外层查询则被标记为Primary

DERIVED

在FROM列表中包含的子查询被标记为DERIVED(衍生)

MySQL会递归执行这些子查询, 把结果放在临时表里。

SUBQUERY

在SELECT或WHERE列表中包含了子查询

DEPEDENT SUBQUERY

在SELECT或WHERE列表中包含了子查询,子查询基于外层

UNCACHEABLE SUBQUERY

无法使用缓存的子查询

UNION

若第二个SELECT出现在UNION之后,则被标记为UNION;

若UNION包含在FROM子句的子查询中,外层SELECT将被标记为:DERIVED

UNION RESULT

从UNION表获取结果的SELECT

type

查询访问的类型,重要指标,指示出索引是否发挥作用。

system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL

其中const是常数性能,eq_ref是索引后唯一,ref是索引+遍历混合,一般需要这个等级的type才比较高效。后面的,range是指定了范围,例如between,ALL是原始遍历。

possible_keys,key,key, key_len, rows

  • possible_keys,指示出相关的所有索引,但只会使用最快的,所以需要从后面几个关键属性中分析。
  • key,实际使用的索引
  • key_len,实际使用索引长度
  • rows,实际查询行数

extra

其他重要信息,例如使用了where,group by,join等等。

Sql索引匹配策略

2020年11月9日

14:50

由于只在部分属性上建立索引,随之而来的问题就是,多个属性的索引的匹配顺序,类型转换,通配符匹配等等情况下的索引匹配策略。

不适合建立索引的情况

  • 记录太少,没有必要
  • 增删多,查询少,维护索引每个操作都需要logN
  • where条件里用不到的属性不必要索引
  • 过滤性不好的属性不需要索引,例如男女,数据无区分度

索引匹配策略

开头提到的诸多比较复杂的场景,MySql中其实是一刀切,选了非常简单的策略。

  • 按建立索引时的属性顺序进行匹配,分层索引。建立索引时的顺序很重要,因为MySql中的匹配顺序就是按照该顺序进行最大匹配的,若是中间有属性没匹配到,则后面的索引不会生效
  • 对建立索引的属性的所有操作,都会导致索引失效,例如类型转换,函数调用
  • 对某个索引的属性进行范围操作,将使得后边的索引失效
  • 不等于,not in将使得索引失效
  • 通配符无法使用索引,索引尽量把通配符写在字符串后面,索引会匹配到通配符为止。
  • or无法使用索引,应该使用union或union all代替,ps,union all是无去重的版本,但是速度快很多,如果知道不会有重复,应该使用后者
  • 尽量覆盖索引,不要select *

MySql进阶,索引,B-Tree以及索引优化相关推荐

  1. 超详细图解!【MySQL进阶篇】存储过程,视图,索引,函数,触发器

    超详细图解![MySQL进阶篇]存储过程,视图,索引,函数,触发器 1.1 下载Linux 安装包 1.2 安装MySQL 1.3 启动 MySQL 服务 1.4 登录MySQL 2\. 索引 2.1 ...

  2. Mysql进阶(上) -- 存储引擎,索引

  3. mysql c 助手类_节日福利,属于你的Offer助手:阿里独家MySQL进阶宝典

    提到MySQL,大家都知道是它最流行的关系型数据库管理系统(RDBMS)之一,而且MySQL近两年一直稳居第二,随时有可能超过Oracle计晋升为第一名,因为MySQL的性能一直在被优化,同时安全机制 ...

  4. 【MySQL | 进阶篇】05、MySQL 视图、触发器讲解

    目录 一.视图 1.1 介绍 1.2 语法 1.2.1 演示示例 1.3 检查选项 1.3.1 CASCADED 级联 1.3.2 LOCAL 本地 1.3.3 示例演示 1.4 视图的更新 1.4. ...

  5. MySQL索引(B+Tree 索引、哈希索引、全文索引、 空间数据索引)、索引优化、优点、使用场景

    1. MySQL 索引是在存储引擎层实现的,而不是在服务器层实现的,所以不同存储引擎具有不同的索引类型和实现. 1.1 B+Tree 索引 是大多数 MySQL 存储引擎的默认索引类型. 因为不再需要 ...

  6. 超详细图解!【MySQL进阶篇】SQL优化-索引-存储引擎

    1. Mysql的体系结构概览 整个MySQL Server由以下组成 Connection Pool : 连接池组件 Management Services & Utilities : 管理 ...

  7. mysql优化 个人笔记 (mysql 进阶索引 ) 非礼勿扰 -m12

    索引优点 减少服务器需要扫描的数据量 帮助服务器避免排序和临时表 将随机IO编程顺序IO 应用场景 快速匹配where字句的行 从consideration中消除行,如果可以在多个索引之间进行选择,m ...

  8. mysql优化 个人笔记 (mysql 进阶索引 ) 非礼勿扰 -m13

    接上一篇 一.union all .in .or -- 还是老朋友 dd DROP TABLE IF EXISTS `dd`; CREATE TABLE `dd` (`d1` varchar(255) ...

  9. Mysql 索引 总结 —— 概述 || 索引优势劣势|| 索引结构(索引是在MySQL的存储引擎层中实现的)|| BTREE 结构||B+TREE 结构||MySQL中的B+Tree||索引分类

    索引概述 MySQL官方对索引的定义为:索引(index)是帮助MySQL高效获取数据的数据结构(有序). 在数据之外,数据库系统还维护者满足特定查找算法的数据结构, 这些数据结构以某种方式引用(指向 ...

最新文章

  1. iscsi网络存储介绍及客户端配置操作
  2. 高级数据结构与算法 | 并查集(Union-Find)
  3. C++是一款设计非常失败的语言吗?
  4. winform中的小技巧【自用】
  5. 一个简单的Python调度器
  6. wkhtmltox html快速转成image或pdf
  7. Java8 实战系列-05-lambda 类型推断
  8. python做积分计算器_PyQt5练习:积分计算器
  9. 蒙特卡洛模拟 matlab实例,蒙特卡洛模拟的简单例子
  10. 假如时光倒流,我会这么学习Java (转载)
  11. 如何将文档转换为一个链接
  12. java ape格式转换_ape格式怎么转换mp3?ape转换mp3的正确方法
  13. PPT文件太大了怎么压缩
  14. java超链接大全_JavaFX超链接
  15. android 环信使用方法,Android 环信的使用
  16. Mac电脑安装win7系统,解决前端IE浏览器兼容性问题
  17. 深度学习的显卡对比评测:2080ti vs 3090 vs A100
  18. 大学里的网络安全专业为什么没多少人就读?
  19. SQL注入之floor报错注入
  20. 免费申报!5G网络Awards参评企业征集,欢迎参与!

热门文章

  1. 无线网络渗透测试系列学习(二) - 在VMware中搭建Metasploit靶机的详细步骤以及端口的简单了解
  2. Launcher3源码分析(LauncherModel加载数据)
  3. 要想知道自己在网上裸奔成啥样?这个网站一搜便知
  4. 论文阅读《Deep Layer Aggregation(DLA)》
  5. java aes 256 ecb解密_Java AES 256 解密
  6. 代码 - 软件测试扎心的痛
  7. 刚上线的棋牌APP就遭DDOS攻击,我该怎么处理?
  8. 微信小程序xr-frame GLTF
  9. 1.0 java_Mybatis_oracle基于WEB的仓库管理系统的设计与实现(源码+数据库sql+论文+视频齐全)----库管理系统---源码在底部
  10. 出门在外 警示大家安全第一:回来路上的一幕