19.查询一行的SQL语句为何很慢?

查询结果长时间不返回

  • 原因:表被锁;

    执行 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 获取事务开始时的数据,可能会消耗较多时间。
 ![](/uploads/article/20190611/5cff4a2d3f0b5.png)
 

思维导图:

Larwas
请先登录后发表评论
  • latest comments
  • 总共0条评论