mysql进阶(三)

 

SQL慢查询日志:

mysql提供的一种日志系统,用于记录响应时间超过阀值的sql语句(long_query_time 默认10秒)

慢查询日志是默认关闭的,开发调试时可以打开,上线时要关闭

检查是否开启了慢查询日志:show variables  like "%show_query_log%"

mysql进阶(三)

mysql进阶(三)

日志的查看

mysql进阶(三)

海量数据分析

mysql进阶(三)

 

profiles会记录所有sql语句花费的时间

mysql进阶(三)

 精确查看时间消耗

mysql进阶(三)

mysql进阶(三)

 

 mysql进阶(三)

 

mysql进阶(三)

 锁

行锁和表锁

表锁:顾名思义就是对整张表进行加锁,同一时刻整张表所有记录都被霸占,虽然不会出现死锁问题但是锁冲突高堵塞高,并发低。

行锁:很明显只对某一行进行加锁,这样表的其余行并不会被占用,冲突低,并发高,但是死锁很可能出现。

锁冲突:就是在多个线程在对竞争资源想同时加锁,僵持不下。
死锁:就是你请求的被别人锁住,被人请求被你锁住了,对方都没法进行下去。

首先行锁innodb默认的锁,但是在筛选条件里面没有索引字段时就会把整个表锁住其他,下面会给出测试例子,最后会讲下mysql innodb引擎为啥需要使用索引来完成对行加锁。
 

mysql进阶(三)

总结:会话0对A表加了读锁;其他会话:可以对其他表(除A表以外的表)进行读    写   操作

             其他会话:对A表,读:可以, 写:需要等待释放锁(即会话0执行 unlock tables;)

 写锁

mysql进阶(三)

 分析表锁定:

    查看那些表加了锁:show  open tables;  1代表加了锁

 

mysql进阶(三)

查看表锁定的严重程度: show status like 'tables%'

mysql进阶(三)

table_locks_immediate:可能获取到的锁数

table_locks_waited:需要等待的表锁数,如果值越大,则表示存在越大的锁竞争

一般建议 如果  table_locks_immediate/table_locks_waited >5000 建议用innodb 否则建议用myisam

行锁:

  mysql进阶(三)

mysql进阶(三)

行锁注意事项:若果没有索引则行锁转为表所

 mysql进阶(三)

 

mysql进阶(三)

 行锁的特殊情况:间隙锁

mysql进阶(三)

mysql进阶(三)

 

mysql进阶(三)

mysql进阶(三)

如果只是查询能否加锁

  可以  在查询语句中加上 for update 就可以对查询语句加锁