本部分用来记录MySQL学习过程中比较小的零碎知识点,分享出去的同时也方便自己后续查看。
1:慢日志慢日志主要参数如下:
控制开关:slow_query_log 写慢日志执行时长:long_query_time 慢日志文件:slow_query_log_file
如下设置:
mysql> set global slow_query_log=1; Query OK, 0 rows affected (0.04 sec) mysql> show variables like 'slow_query_log'; +---------------------+---------------------------------------------------------------+ | Variable_name | Value | +---------------------+---------------------------------------------------------------+ | slow_query_log | ON | +---------------------+---------------------------------------------------------------+ 1 rows in set (0.00 sec) mysql> set long_query_time=0; Query OK, 0 rows affected (0.00 sec) mysql> show variables like 'long_query_time'; +-----------------+----------+ | Variable_name | Value | +-----------------+----------+ | long_query_time | 0.000000 | +-----------------+----------+ 1 row in set (0.00 sec) mysql> show variables like 'slow_query_log_file'; +---------------------+---------------------------------------------------------------+ | Variable_name | Value | +---------------------+---------------------------------------------------------------+ | slow_query_log_file | D:program_filesphpstudyPHPTutorialMySQLdatajhp-slow.log | +---------------------+---------------------------------------------------------------+ 1 row in set (0.00 sec)
为了测试效果将long_query_time设置为0,这样所有执行的sql语句都会记录到慢日志中,比如执行如下的sql语句:
mysql> select count(*) from t; +----------+ | count(*) | +----------+ | 100000 | +----------+
就可以查看生成的慢日志了:
2:MVCCInnoDB通过MVCC(multi version concurrent control)多版本并发控制,来实现RR,RC隔离级别,具体的实现是通过在每行数据增加额外的两列数据,一个是产生当前行修改的事务ID,一个是指向上一个行修改版本的指针,这样就组成了一行数据的版本链,这个版本链就是undo log,假设有如下的版本链:
假设现在事务ID为56的事务启动,而当前正在执行的事务ID组成的数组是[8,43,49],这个数组我们叫做是一致性视图数组,用来辅助实现RC,RR的数据可见性,其中我们记录这个数组中的8,称之为低水位,本事务ID+1(本事务启动过程中不会启动其他事务),即56+1=57,我们作为高水位,假设在RR的隔离级别下,会按照如下规则来获取数据:
1:如果是当前行的事务ID在一致性视图数组中,说明该事物在本事务启动时还未提交,所以不可见 2:如果是当前行的事务ID小于低水位,说明该事物在本事务启动前已经提交,所以可见 3:如果是当前行的事务ID大于等于高水位,说明该事物是在本事务启动后才启动的,所以不可见 4:如果是当前行的事务ID即不小于低水位,也不大于高水位,也不在一致性视图数组中,说明该事物在本事务启动前已经提交,所以可见
假设现在执行sqlselect * from t where name="张三",则查找过程如下:
所以最后返回的结果是:
写在后面参考文章列表:
MySQL慢查询日志(Slow Query Log) 。



