02.04 Day 16 - 重温 Day 7

大家好,我是 Snow Hide,作为《MySQL 实战》这个专栏的学员之一,这是我打卡的第 16 天,也是我第 67 次进行这种操作。

今天我温习了该专栏里一篇叫《为什么我只查一行的语句,也执行这么慢?》的文章。

关键词总结:第一类语句慢的原因,查询长时间不返回(等 MDL 锁、等 flush、等行锁)、第二类语句慢的原因,查询慢(当前读、一致性读)。

所学总结:

第一类语句慢的原因,查询长时间不返回

通过 show processlist 命令查看当前语句的状态。

等 MDL 锁

当看到状态为 “Waiting for table metadata lock” 的语句。
某个线程正请求或持有表的 MDL 写锁,并拦截 select 语句。

等 flush

当看到状态为 “Waiting for table flush” 的语句。
某个线程正在对表做 flush 操作。

等行锁

由于访问某个记录时要加锁,如果这时已经有一个事务在这行记录上持有一个写锁,我们的查询语句就会被堵住。
 

第二类语句慢的原因,查询慢

为了把所有语句记录到 slow log 里,在连接后先执行 set long_query=0,将慢查询日志的时间阈值设置为 0。

当前读

速度很快,因为语句后加 lock in share mode。

一致性读

没有后加 lock in share mode 的语句,速度会慢一些。

末了

重新总结了一下文中提到的内容:查一行可能出现被锁和执行慢的情况、表锁、行锁、一致性读。

发布了132 篇原创文章 · 获赞 6 · 访问量 7963

猜你喜欢

转载自blog.csdn.net/stevenchen1989/article/details/104164649