只查一行语句,执行慢的原因
执行“查一行”,可能会出现的执行长时间不返回被锁住和执行慢的情况。这其中涉及到了表锁、行锁和一致性读的概念。
一、长时间不返回
查询长时间不返回
查询长时间不返回时,大概率是表 t 被锁住了。接下来分析原因的时候,一般都是首先执行一下 show processlist 命令,看看当前语句处于什么状态。
有可能是行被锁住了吗? 为什么不太可能,因为这个SELECT不是 for update,因此即使有人占着行锁,SELECT只是返回已提交的数据即可,并不需要等到其他更新操作完成。
解决方法:通过查询 sys.schema_table_lock_waits 这张表,我们就可以直接找出造成阻塞的 process id,把这个连接用 kill 命令断开。
such as,
SELECT concat('KILL ',id,';')
FROM information_schema.processlist p
INNER JOIN information_schema.INNODB_TRX x
ON p.id=x.trx_mysql_thread_id
WHERE db='test';
等MDL锁
等 MDL 锁,就是使用 show processlist 命令查看 Waiting for table metadata lock 的示意图。 Waiting for table metadata lock 状态示意图: