为什么我只查一条语句也执行这么慢?

一、 只查一行的语句,也可能出现被锁住的三种情况

  1. 表锁(MDL和flush被阻塞了)
  2. 行锁
  3. 一致性读

一般碰到这种情况的话,大概率是表被锁住了。分析原因的时候,一般都是首先执行一下 show processlist 命令,看看当前语句处于什么状态;

二、一致性读和行锁问题的产生,先看下面5条sql:

select * from t where id=1 lock in share mode;
select * from t where id=1;
select blocking_id from sys.schema_table_lock_waits;
select * from information_schema.processlist where id=1;
select * from sys.innodb_lock_waits where locked_table='test'.'t'\G;

这5条语句对应的解释:

  1. 访问 id=1 这个记录时要加读锁,如果这时候已经有一个事务在这行记录上持有一个写锁,我们的 select 语句就会被堵住。带 lock in share mode 的 SQL 语句,是当前读,因此会直接读到 1000001(其它事物中更新的结果) 这个结果;
  2. 这个语句,是一致性读,要等别的事物把这个记录上的锁释放才能读到这个数据;
  3. 找出造成阻塞的 process id;
  4. 找到查询被堵住的情况;
  5. 查出是谁占着这个写锁;

三、常见的锁有:

  • 表锁
  • 行锁
  • 共享锁
  • 互斥锁
  • 意向锁
  • 间隙锁
  • 记录锁
  • Next-Key锁
  • 插入意向锁
  • AUTO-INC锁

版权

本作品采用 CC BY-NC-ND 4.0 授权,转载必须注明作者和本文链接。

下一篇:redis的一些总结