美文网首页MySQL
mysql深入学习01

mysql深入学习01

作者: 獨自去遠方 | 来源:发表于2019-04-23 00:05 被阅读66次

1.体系结构

mysql体系结构图

Mysql是由SQL接口,解析器,优化器,缓存,存储引擎组成的(SQL Interface、Parser、Optimizer、Caches&Buffers、Pluggable Storage Engines)

(1) Connectors指的是不同语言中与SQL的交互 

(2)Management  & Utilities: 系统管理和控制工具,例如备份恢复、Mysql复制、集群等 

(3)Connection Pool: 连接池:管理缓冲用户连接、用户名、密码、权限校验、线程处理等需要缓存的需求 

(4)SQL Interface: SQL接口:接受用户的SQL命令,并且返回用户需要查询的结果。比如select from就是调用SQL Interface 

(5)Parser: 解析器,SQL命令传递到解析器的时候会被解析器验证和解析。解析器是由Lex和YACC实现的,是一个很长的脚本, 主要功能: 

    a . 将SQL语句分解成数据结构,并将这个结构传递到后续步骤,以后SQL语句的传递和处理就是基于这个结构的 

    b. 如果在分解构成中遇到错误,那么就说明这个sql语句是不合理的 

(6)Optimizer: 查询优化器,SQL语句在查询之前会使用查询优化器对查询进行优化。他使用的是“选取-投影-联接”策略进行查询。 

(7) Cache和Buffer(高速缓存区): 查询缓存,如果查询缓存有命中的查询结果,查询语句就可以直接去查询缓存中取数据。

(8)Engine :存储引擎。存储引擎是MySql中具体的与文件打交道的子系统。

默认下MySql是使用MyISAM引擎,它查询速度快,有较好的索引优化和数据压缩技术。但是它不支持事务。 

InnoDB支持事务,并且提供行级的锁定,应用也相当广泛。 

Mysql也支持自己定制存储引擎,甚至一个库中不同的表使用不同的存储引擎,这些都是允许的。

2.索引

是什么:加速对表中的数据进行检索的一种分散存储的数据结构。

why to user:

    索引能极大的减少存储引擎需要扫描的数据量

    索引可以把随机IO变成顺序IO

    索引可以帮助我们在进行分组、排序等操作时,避免使用临时表

3.底层结构--使用B+树

    二叉查找树

    平衡二叉查找树

why not use 二叉树

1. 二叉树存储数据过深,决定IO次数过多

2. 每个磁盘页包的数据太小,不能很好利用磁盘IO,以及磁盘IO的预读能力(空间局部性)

多路平衡查找树

    B+树

B+树与B树的区别:

1,B+节点关键字搜索采用闭合区间

2,B+非叶节点不保存数据相关信息,只保存关键字和子节点的引用

3,B+关键字对应的数据保存在叶子节点中

4,B+叶子节点是顺序排列的,并且相邻节点具有顺序引用的关系

B+树的优点:

B+树是B-树的变种(PLUS版)多路绝对平衡查找树,他拥有B-树的优势

B+树扫库、表能力更强

B+树的磁盘读写能力更强

B+树的排序能力更强

B+树的查询效率更加稳定(仁者见仁、智者见智)

4.索引表现形式

 innodb和myisam的索引比较,左边为innodb

5.索引知识补充

索引特点:

    离散性越高选择性越好

    最左匹配原则

联合索引

    单列索引 [关键字a],

    联合索引 [关键字a,关键字b],单列索引是特殊的联合索引

联合索引列选择原则 

    1,经常用的列优先 【最左匹配原则】 

    2,选择性(离散度)高的列优先【离散度高原则】 

    3,宽度小的列优先【最少空间原则】

如果查询列可通过索引节点中的关键字直接返回,则该索引称之为 覆盖索引


6.总结

    索引列的数据长度能少则少。--》B+树的数据结构,索引长度越短,相同存储能够容纳的索引越多

    索引一定不是越多越好,越全越好,一定是建合适的。--》维护索引需要付出代价,索引占用存储

    匹配列前缀可用到索引 like 9999%,like %9999%、like %9999用不到索引; Where 条件中 not in 和 <>操作无法使用索引; 匹配范围值,order by 也可用到索引;--》索引匹配原则

    多用指定列查询,只返回自己想到的数据列,少用select *;--》覆盖索引

    联合索引中如果不是按照索引最左列开始查找,无法使用索引;

    联合索引中精确匹配最左前列并范围匹配另外一列可以用到索引;

    联合索引中如果查询中有某个列的范围查询,则其右边的所有列都无法使用索引;--》联合索引符合单列索引的匹配规则

这里有一篇不错的博文

相关文章

网友评论

    本文标题:mysql深入学习01

    本文链接:https://www.haomeiwen.com/subject/zlxpgqtx.html