###查询结果长时间不返回
原因:表被锁; 执行 show processlist 查看当前语句所处状态
状态1:等 MDL 锁 有一个线程正在表上请求,或者持有 MDL 锁,把 SELECT 语句堵住了。 show processlist 返回的是:waiting for table metadata lock 处理方法:找到谁持有 MDL 写锁,将其 kill 掉。 使用 select blocking_pid from sys.schema_table_lock_waits; 查询造成阻塞的 process id,使用 kill 命令断开这个连接即可(mysql 5.7)。
状态2:等 flush flush tables 命令被别的语句堵住 flush 操作命令: flush tables t with read lock; flush tables with read lock;
状态3:等行锁
访问记录时要加读锁,如果这时候有个事务在这行记录上持有写锁,select 语句就会被堵住。
解决:
MySQL 5.7 版本可以通过 sys.innodb_lock_waits 查到谁占着写锁。kill 掉。
mysql> select * from t sys.innodb_lock_waits where locked_table='库名'.'表名'
\G
###一条语句查询慢 启动事务时需要一致性读 读 undo log 获取事务开始时的数据,可能会消耗较多时间。
#思维导图:
本文为Larwas原创文章,转载无需和我联系,但请注明来自larwas博客 https://larwas.com
最新评论