等待MySQL表上的表级锁定

时间:2014-04-02 11:05:18

标签: mysql sql innodb myisam

最近几天,随机时间我的网站变得非常慢。我开始调查我能做的最好的事情。我看到MySQL进程使用了​​我服务器85-95%的可用内存(我是否应该升级内存?)。

我检查了我的MySQL进程日志,我注意到了一大堆查询:

  

等待表级锁定

但是我也注意到,所有这些带有“表级锁定”的查询只是与我的表users有关的查询。

我有20个其他表,有常量查询,但我没有在列表中看到它们。所以我猜问题是用户表?

我想知道如何改进表,最终删除表级锁?

我也跑了这个:

SHOW VARIABLES LIKE 'query_cache%';

导致了这个:

query_cache_limit
1048576
query_cache_min_res_unit
4096
query_cache_size
33554432
query_cache_type
ON
query_cache_wlock_invalidate
OFF

请让我知道我可以做些什么来改进我的数据库/ mysql。

这是一个过程列表:

   | 228 | db_user | localhost | db_db| Query          |    5 | Waiting for table level lock | SELECT count(*) FROM users WHERE createtime>'1396411200' OR createtime='1396411200'                  |
    | 229 | db_user | localhost | db_db| Query          |    4 | Waiting for table level lock | UPDATE users SET upline_clicks=upline_clicks+'1', upline_earnings=upline_earnings+'0.0000' WHERE use |
| 203 | db_user | localhost | db_db| Query          |    6 | Waiting for table level lock | SELECT SUM(cashedout) FROM users                                                                     |
| 204 | db_user | localhost | db_db| Query          |    4 | Waiting for table level lock | UPDATE users SET upline_clicks=upline_clicks+'1', upline_earnings=upline_earnings+'0.0000' WHERE use |
| 205 | db_user | localhost | db_db| Query          |    1 | Waiting for table level lock | SELECT * FROM users WHERE id='12055'                                                                 |
| 206 | db_user | localhost | db_db| Query          |    2 | Waiting for table level lock | SELECT * FROM users WHERE id='22530'                                                                 
| 197 | db_user | localhost | db_db| Query          |    3 | Waiting for table level lock | SELECT * FROM `users` WHERE `username` = 'ptc4life123' LIMIT 1                                       |
| 200 | db_user | localhost | db_db| Query          |    3 | Waiting for table level lock | UPDATE users SET upline_clicks=upline_clicks+'1', upline_earnings=upline_earnings+'0.0050' WHERE use |

这基本上就是所有锁定过程的样子。

2 个答案:

答案 0 :(得分:3)

在其中一个慢速期间,运行以下命令:

show processlist;

这将显示正在运行的实际SQL命令,以及在添加索引方面要查找的位置。如果可能,发布运行时间最长的SQL。

添加索引将如下所示:

 ALTER TABLE MYTABLE ADD INDEX idx_columnname (COLUMN_NAME ASC) ;

但是你要注意不要在生产期间这样做。乍一看,您希望在用户表中的ID和用户名列上执行此操作。

答案 1 :(得分:0)

检查表的存储引擎。如果可能,请更改为Innodb,因为它只会导致行级锁定。 即使您使用innodb表,正在运行的查询可能会强制表锁定 如果你没有使用索引。