Mysql的数据读取浅谈

                                                   MySQL体系结构

数据库永远分为俩层去看:CPU+内存,硬盘

 

用户请求过来后,会先通过Commander Dispatcher找到Query Cache Module(缓冲)进行查看
Query Cache Module

       同样的查询,第一条查询,会把从磁盘中查出来的数据缓冲到数据库的内存中,等在一个同样的查询来到时候就直接访问内存(内存读比磁盘读要快的多)

       磁盘io(意为磁盘数据输入输出)   当使用update语句时候,如果只修改一条语句,也会触发mysql的一种机制,让他去在查询一次磁盘,这样更加消耗性能,所以一些公司关掉了此缓冲功能。

注意:mysql8.0以后这个功能被干掉了

当Query Cache Module没有查到时候,他会找到Parser

从此开始也是SQL的语句执行步骤

Parser(解析)

    Parser,又称解析,去知道在哪里能找到对应的表,从而取到相应的数据

解析---》执行计划

核心层(mysqld)(基于CPU和内存):解析sql语句,生成合理的执行计划,然后取数据‘

存储引擎层:

                     存储引擎InnoDB(MySQL5.5之后默认的引擎为InnoDB),是按照主键索引来放置的数据,所以每个主键索引                  都是一条数据,当找到主键索引后,无需再去进行数据定位即可获取到对应的数据。(注:如果创建一个InnoDB类                  型的表,他没有主键,它自动就会用第一个非空且唯一的列,会建立隐藏列(6字节),以隐藏列为主键)

                     存储引擎MyISAM,典型的堆表,存一条数据就放进去,再来一条就在塞进去,是按照数据存储顺序存放的。                    获取数据时候,比如通过索引找到对应的id后再通过id到表里进行数据定位,比InnoDB要麻烦一步。但是他的辅助索                引更好一些,因为他是直接通过辅助索引就可以查到对应的数据,但是InnoDB得由主键再去进行主键索引查询才能                  获取到数据。

                     至于走那个引擎,需要判断后进行选择,之后进行后续的sql语句执行流程。

SQL语句的执行流程(图画分析)

 

MySQL内部解析

       查询出来的数据会先从磁盘(emp)拿出来放于MySQL内部的innodb buffer pool内存里,之后后续相同的查询会直接从pool里面进行查找,这样会使速度更快避免一直访问磁盘。放于内存后,它会去用户私密的区域soft buffer去进行排序(有order才在这里排序),之后进行数据获取。

       log buffer(日志先行),不管什么操作都会先在日志进行记录之后才会有真正的操作。此举是为了防止数据库宕机而设置的,日志会进行“落盘”,而“落盘”是通过readdo日志把logbuffer的日志刷到磁盘中的。

 

 

注意:

          1、MySQL是一个单进程多线程的服务器,进而处理高并发

          2、idle类型(会话)的线程mysql多少都可以承受,active类型的线程(会话)当达到125个的时候就会使数据库危险了

          3、Innodb索引特点:(1)最左原则(2)二级索引要回表(3)支持索引扫描

          4、Innodb的索引:聚簇,唯一索引,普通索引,前缀索引

          5、唯一索引和普通索引的区别:只有普通索引能用出change buffer ;

                                                              普通索引适合于频繁写入,但不常读取。

          6、不走索引的情况:函数,!=,<>,is null,不符合最左原则时,where id+1 = 6。where语句中出现like ‘T%'的语句可以                    走索引。

          7、Explain:type=ref(索引等职查询)range(索引范围查询)all(全盘扫描)       查看走不走索引

          8、char(20)就为20字节;varchar(20)他为22字节,var变长位还要占了2字节;datetime为8;date为3

          9、Order by后面加索引,注意select后面出现的值要在索引中出现

          10、Temporary buffer (临时空间):用到他的为group by(分组后自动排序的时候用),union,distinct(去重)(distinct                 (属性))。当此空间不够大时候,会借助磁盘。 

          11、Sync_binlog,innodb_flush        他俩的值设为1时候,就是最安全的(每一次提交刷新一次);设为0时候,是性能最高                     的,但是可能丢数据(每一秒刷新一次)

          12、版同步可以防止主从同步数据丢失

         

 

 

个性签名:一个人在年轻的时候浪费自己的才华与天赋是一件非常可惜的事情

        如果觉得这篇文章对你有小小的帮助的话,记得在左下角点个“👍”哦,博主在此感谢!

 

万水千山总是情,打赏5毛买辣条行不行,所以如果你心情还比较高兴,也是可以扫码打赏博主,哈哈哈(っ•̀ω•́)っ✎⁾⁾! 

©️2020 CSDN 皮肤主题: 点我我会动 设计师:上身试试 返回首页