大家好,我是 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 的语句,速度会慢一些。
末了
重新总结了一下文中提到的内容:查一行可能出现被锁和执行慢的情况、表锁、行锁、一致性读。