美文网首页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