宽屏模式

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 获取事务开始时的数据,可能会消耗较多时间。

#思维导图:

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