当前位置:   article > 正文

翻过爪哇浪浪山(Mysql篇)

翻过爪哇浪浪山(Mysql篇)

前言

五千年文化,三千年诗韵

·写进人生沧桑的9句诗你走到了哪里:

·18岁春风得意马蹄疾,一日看尽长安花。

·21有一美人兮,见之不忘,一日不见兮,思之如狂。

·24岁安能摧眉折腰事权贵,使我不得开心颜。

·27岁人面不知何处去,桃花依旧笑春风。

·30岁不如意事常八九,可与人言无二三。

·40岁回首向来萧瑟处,也无风雨也无晴。

·55岁万里悲秋常作客,百年多病独登台, 艰难苦恨烦双鬓, 潦倒新停浊酒杯。

·70岁世事一场大梦,人生几度秋凉。

·80岁古今多少事,都付笑谈中。

正言

        看见一篇不错的文章,一句sql翻过的浪浪山。我们常常使用框架(mybatis,jpa,hibernate)写sql去查数据库,但是谁又能知道这一句简单的sql又经历了什么,其实相对于查询比较简单走的路很少,但是对于update,insert其实是走过了一条常常的路,我先说说我今天看到这篇文章的一个印象。

        第一步:当我们执行程序时候 框架进行了sql组装和预处理,这个过程包括了链接数据库,因为涉及每一条sql执行需要连接和销毁数据库,比较浪费资源和内存也大大影响了性能,所以就产生了连接池如c3po,diurd,dbcp等

        第二步:连接成功后Mysql线程获取到sql把sql交给了sql接口去处理,sql接口把sql语句交个解析器处理,主要目的是把我们能看懂的sql编译成Mysql数据库能看懂的语句。

        第三步:sql处理器编译完交给了sql的查询优化器,他的主要目的是(选择最优查询路径)按照自己认为效率最高的方式去查询,将查询成本缩小到最小,也就是I/O和Cpu优化,因为读取数据库是要进行磁盘I/O加载到内存当中,数据库InnoDb引擎是一页默认16kb读取数据,相当于你本应该获取的这条数据相邻的数据都加载到内存,在内存中CPU会处理这条数据进行检查,比如排序或者检查是否符合条件等。

        第四步:解析完数据现在就开始正儿八经查询了,把sql交给执行器,执行器根据一系列的执行计划去调用存储引擎接口。

        第五步:去内存(引擎中的组件Buffer Pool)中查找,查不到再去磁盘中查找,再放到内存中顺便会加上独占锁防止其他线程操作,看起来跟Resid差不多,就是起到了缓存作用防止多次I/O。

        在把执行语句加载到缓存中(Buffer Pool)同时会记录一条日志到undo log文件中,这条日志是在语句执行前的旧数据,防止在事务回滚后还原旧数据。

        上面数据加载到缓存中会出现一个问题,在数据库宕机时候缓存中的数据是不是会丢失,mysql防止这种问题发生所以就出现了redo log Buffer,这个也是在内存中完成,主要记录修改后的数据,innoDb防止musql宕机,采用立即将redo log buffer刷入到磁盘中,服务重启后再将redo文件加载到缓存中。

        最后说下Mysql级别的日志bin log,上面都是引擎级别的,他是记录每条执行修改操作删除的语句进行记录,在你数据误删时候可以通过bin log日志恢复,主从复制也使用bin log。

 

        今天到此结束吧,明天依旧光芒万丈啊!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/622088
推荐阅读
相关标签
  

闽ICP备14008679号