MySQL只查一行语句,为什么慢?
2020-07-01 本文已影响0人
森林中大鸟
硬件压力
- 数据库本身压力过大, 磁盘io利用率太高
等待
- 锁等待
等待MDL锁, 使用show proceslist 查询当前SQL执行的状态可发现是否被其他语句堵塞.
MySQL启动时设置 performance_scheme=on (有10%左右性能损失) 然后 查询sys.scheme_table_lock_waits表得到阻塞的process id ,kill id即可解锁
- 等flush
flush tables t read lock 指定表名的话表代表之关闭表 t
flush tables read lock 表示关闭所有打开的表.这两个语句执行很快,但可能被其他操作堵塞.从而堵住我们的查询语句
可通过 show processlist 查询出堵塞的原因.
- 等行锁
写锁会堵塞查询语句获得读锁,读锁不会阻塞.
可通过show processlist 查询到占有锁的操作, MySQL5.7可通过sys.innodb_lock_waits表查询到.
然后kill 掉 processId 对应的操作即可.
查询慢
慢查询日志开启 set long_query_time = 0
当一致性读遇到大量的更新语句时, 需要执行完大量的undo log 才会返回查询结果.
可开启慢查询日志观察.
举个例子:
todo