没想到啊

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  6 随笔 :: 379 文章 :: 97 评论 :: 24万 阅读
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

http://www.iteye.com/topic/1119734

现在的工作环境跟MySQL打的交道比较多,把平时工作中遇到的有意思SQL的部分总结一下. 

知识来源:看书,工作总结,官方文档... 

从哪开始呢,先从基本结构开始吧:ok let's go. 

1:先看MySQL整体模块图: 

 
(图片取自MySQL核心技术) 
从图中可以看出MySQL的模块职责分工明确,不愧是Monty团队20年的结晶.好产品是靠持续的汗水浇灌的啊(扯远了)。。。 
其中MySQL语句大概分两种:SQL和命令 

SQL无非就是DDL,DML,命令是mysql自身语法如:show [table,process,database,index] , source ...等等. 

用一条DML为例,连接管理器模块,线程模块,权限模块职责很明确此处略. 

第一步由Commander Dispatcher(命令)模块统一接受处理, 
1)如果开启全查询日志(是log 不是slow-low),会记录所有的语句(包括错误语句) 
2)如果开启查询缓存(query_cache_type=1)会先判断语句是否可缓存,如果可以使用语句和客户端信息等的hash值查询query cache模块 如果找到数据短路. 

第二步将语句转交parser模块进行解析,并发送给不同模块(优化器,表修改模块,表维护模块,复制模块,状态模块等) 
其中最重要的是优化器模块,这个是所有数据库的核心,所有的DML都经过它完成 
(这个后面的文章做进一步总结和学习,sql的快与慢全靠他.) 

第三步假如进入优化器模块:MySQL的优化器的只定义了抽象存储引擎(Handler) 
具体实现由存储引擎完成(mysql的插件引擎特性) 

第四步进入存储引擎内部完成具体的数据读取和修改,内部有很复杂的处理流程和日志体系(如:innodb buffer_pool,redo,undb等..). 

第五步返回数据,如果开启查询缓存会做尝试做缓存.最后完成清理工作,回收线程. 
这里非常粗粒度的介绍的MySQL模块见的相互配合完成sql的过程,具体流程比这复杂的多,正在看书并结合源码研究中。。 
简单语句流程到这里,MySQL下面看看另一张关注parser, optimizer的流程图 
 
(图片取自高性能MySQL) 

这张图更能体现sql的一些解析处理和优化过程. 
这里有个问题需要介绍以下MySQL没有全局sql字节码缓存,所有的语句都要解析成语法树. 
如果使用PrepareStatement的机制发送SQL 则mysql只在当前session支持预编译 
官方解释如下: 
http://dev.mysql.com/doc/refman/5.1/en/sql-syntax-prepared-statements.html 
这里和Oracle由很大不同,也就是说你没有使用变量绑定,MySQL也不会像Oracle那样迅速被拖慢... 
mysql有SQL服务器模式,通过sql-mode参数体现. 
可以随时更改自己的会话 sql_mode值 
主要sql_mode取值如下: 
· ANSI: 
· STRICT_TRANS_TABLES: 
·TRADITIONAL 
·ALLOW_INVALID_DATES 
·ANSI_QUOTES 
·ERROR_FOR_DIVISION_BY_ZERO 
·HIGH_NOT_PRECEDENCE 
查看官方文档解释:http://dev.mysql.com/doc/refman/5.1/zh/database-administration.html#server-sql-mode 
你在mysql中遇到不一致的sql执行结果时,记得看看你session的sql_mode 

开始部分只是粗粒度介绍下MySQL 关于sql的地方,后面会陆续把sql执行细节,优化过程和工作中的问题拿出来分享一下,希望与各位交流讨论. 

posted on   没想到啊  阅读(250)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述
点击右上角即可分享
微信分享提示