mysql进阶(三)
SQL慢查询日志:
mysql提供的一种日志系统,用于记录响应时间超过阀值的sql语句(long_query_time 默认10秒)
慢查询日志是默认关闭的,开发调试时可以打开,上线时要关闭
检查是否开启了慢查询日志:show variables like "%show_query_log%"
日志的查看
海量数据分析
profiles会记录所有sql语句花费的时间
精确查看时间消耗
锁
行锁和表锁
表锁:顾名思义就是对整张表进行加锁,同一时刻整张表所有记录都被霸占,虽然不会出现死锁问题但是锁冲突高堵塞高,并发低。
行锁:很明显只对某一行进行加锁,这样表的其余行并不会被占用,冲突低,并发高,但是死锁很可能出现。
锁冲突:就是在多个线程在对竞争资源想同时加锁,僵持不下。
死锁:就是你请求的被别人锁住,被人请求被你锁住了,对方都没法进行下去。
首先行锁是innodb默认的锁,但是在筛选条件里面没有索引字段时就会把整个表锁住其他,下面会给出测试例子,最后会讲下mysql innodb引擎为啥需要使用索引来完成对行加锁。
总结:会话0对A表加了读锁;其他会话:可以对其他表(除A表以外的表)进行读 写 操作
其他会话:对A表,读:可以, 写:需要等待释放锁(即会话0执行 unlock tables;)
写锁
分析表锁定:
查看那些表加了锁:show open tables; 1代表加了锁
查看表锁定的严重程度: show status like 'tables%'
table_locks_immediate:可能获取到的锁数
table_locks_waited:需要等待的表锁数,如果值越大,则表示存在越大的锁竞争
一般建议 如果 table_locks_immediate/table_locks_waited >5000 建议用innodb 否则建议用myisam
行锁:
行锁注意事项:若果没有索引则行锁转为表所
行锁的特殊情况:间隙锁
如果只是查询能否加锁
可以 在查询语句中加上 for update 就可以对查询语句加锁