标签归档:mysql

MySQL执行过程

MySQL执行过程
在用户执行MySQL启动命令后,MySQL的初始化模块从配置文件中读取系统参数和命令行参数,并按照这些参数初始化整个系统,同时启动并初始化各存储引擎。
在系统初始化结束后,连接管理模块启动监听程序,准备接受客户端的请求。
当一个客户端通过网络连接到MySQL服务器时,连接管理模块会监听到这个请求,通过MySQL自己定义的协议,执行相关的底层任务后,连接管理模块将请求转发给线程管理;
线程管理会提供一个连接线程来处理这个连接,如果线程缓存(Thread Cache)中有空闲的连接线程,那么就会从线程缓存中直接取一个连接线程,否则新创建一个连接线程;

此时,连接线程会调用安全管理模块,进行授权检查,验证用户访问的合法性(用户是否有权访问数据库服务器,用户密码是否正确等)
然后,连接线程开始处理客户端请求所发送过来的命令(或者Query)
对于命令,不需要调用Parse就可以直接执行
对于Query,需要进行Query解析和转发模块的解析,在Query解析器进行分析,如果是一个SELECT类型的Query,则调用查询缓存(Query Cache),检查是否存在相同的查询语句,如果存在则直接将cache中的数据返回,如果不存在或者不是SELECT类型的Query,则将此Query返回解析器。在此时的解析器中,如果是SELECT类型,则它会将控制权交给查询优化器,如果是DML或DDL语句,则会交给表变更管理模块,如果是一些更新统计信息,检测,修复和整理类的Query,则会交给表变更管理模块
这些模块在收到Query解析与分发模块分发过来的请求后,首先会通过访问控制模块检查连接用户是否有访问目标表和目标字段的权限,如果有相关权限,就会调用表管理模块请求相应的表,并获取相应的锁。
在打开表后,根据表的相关meta信息,判断表的存储引擎类型和相关信息。
根据表的存储引擎类型,提交请求给存储引擎接口,调用对应的存储引擎实现模块进行处理。

以上只是正常的流程,在此过程中还有处理失败的返回,验证失败的返回等等。如果MySQL打开了bin-log选项并且操作过程中数据发生的变化,那么相应的模块在处理的过程中会调用日志处理模块,将相应的变更语句以更新事件的形式记录到相关参数的二进制日志文件。

以上内容摘抄自《MySQL性能调优与架构设计》

MySQL中的排序

MySQL中的排序

曾经以为filesort是文件排序,后来知道这仅仅是一个排序,文件只是路人甲而已
前些日子从china-pub上买了《Mysql核心内幕》,当浏览到第4章时,以前对MySQL的排序,join buffer不理解的地方,忽然觉得懂了,只是不知道这个懂了是真懂了还是假懂了。
就如当你从一个梦中醒来,难道你就确认你一定不是在做梦了吗?

说说看了什么吧,
filesort排序算法是将一组记录或元素按照快速排序算法放入到内存缓存,然后这几个内存缓存按合并排序算法排序。(摘自《Mysql核心内幕》第82页)
filesort有两种模式:
1、直接模式,将已经数据完全读取出来,然后进行排序
2、指针模式,先根据过滤条件取出排序字段(sort_key)和可以行指针信息(row_id),根据sort_key排序后,再依据row_id取出取出查询中所请求的其他字段。
第一种算法的优势是减少了数据的二次访问,当然会消耗更多的内存,在算法上来讲是以空间换时间。
MySQL会尽量采用每一种方式,只有在每一种方式不行的情况下才会采用第二种方式(即指针模式)

然后是MySQL的三种排序方法:
1、使用索引排序
2、在单表上使用filesort排序
3、先使用临时表,再使用filesort排序
(摘自《Mysql核心内幕》第83页)

mysql各版本之间的差别

在PHP面试中经常会遇到关于mysql各版本之间差别的问题,
翻看以前的书籍(《MySQL5 权威指南》)找到如下答案,另外参考了如下网址的部分内容
摘抄如下:
功能 版本(开始支持的版本)

镜像(动态复制)                                             3.23
在MyISAM数据表中进行全文搜索              3.23
BDB数据表开始支持事务                                3.23.34
InnoDB数据表开始支持事务处理                3.23.34
InnoDB数据表上的引用集成性检查功能   3.23.34
==================================
Delete和跨多个数据表的Delete                  4.0
跨多个数据表的UPDATE                               4.0
UNION(合并多个SELECT结果)                   4.0
查询缓冲区(加快重复执行的SQL命令的执行速度) 4.0
嵌入式MySQL库                                               4.0
加密通信(SSL)                                             4.0
InnoDB数据表开始支持热备份                    4.0
适用于客户软件共享函数库的GPL许可证   4.0
================================
子查询                                                                   4.1
支持Unicode(UTF8和UCS2=UTF16)        4.1
支持GIS(GEOMETRY数据类型,R树索引)        4.1
可变语句(带参数的SQL命令)                      4.1
GROUP BY 语句增加ROLLUP子句                 4.1
mysql.user数据表采用了更好的口令字加密算法      4.1
允许单个数据表单独存在一个InnoDB表空间文件里   4.1
======================================
VARCHAR类型的数据列可以容纳超过255个字符      5.0
引入了了BIT数据类型                                          5.0
存储过程                                                                  5.0
触发器                                                       5.0
视图                                                           5.0
游标                                                           5.0
更节约空间的InnoDB表空间格式                          5.0
新的数据库架构管理方案(数据字典,INFORMATION_SCHEMA数据库)5.0
====================================================
FULL OUTER JOIN                     5.1
事件调度                                                5.1
分区                                                        5.1
基于行的备份                                      5.1
插件API                                               5.1
服务器日志表                                     5.1
外键 6.x (3.23版本中已在innoDB中实现)

以上所示的版本是指开始支持的版本