Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
正在等待MySQL表上的表级锁_Mysql_Sql_Innodb_Myisam - Fatal编程技术网

正在等待MySQL表上的表级锁

正在等待MySQL表上的表级锁,mysql,sql,innodb,myisam,Mysql,Sql,Innodb,Myisam,在过去的几天里,我的网站变得非常缓慢。我开始尽我所能进行调查。我看到MySQL进程占用了我服务器85-95%的可用内存(我是否也应该升级内存?) 我查看了我的MySQL进程日志,发现一个巨大的查询列表: 等待表级锁 但我也注意到,所有这些带有“表级锁”的查询都只是与我的名为users的表有关的查询 我还有20个其他的表,不断地查询,但我没有在列表中看到它们。。所以我想问题出在用户表上 我想知道如何改进表,并最终移除表级锁 我还运行了以下程序: SHOW VARIABLES LIKE 'query

在过去的几天里,我的网站变得非常缓慢。我开始尽我所能进行调查。我看到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 |

这就是所有锁定进程的基本情况。

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

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

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

添加索引将如下所示:

 ALTER TABLE MYTABLE ADD INDEX idx_columnname (COLUMN_NAME ASC) ;

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

开始为用户添加索引,特别是像用户名、部门、ID等字段。查询中经常使用的任何内容。索引?想详细说明一下吗?(对不起,我还是MySQL的新手)你能试着解释一下“索引”吗。我应该如何使用它们?索引是指向数据的指针。它将是一个二叉树(最常见),将整行作为叶节点。例如,主键是指向单行的索引。区别在于它将被排序,这样您就不必去做完整的表扫描来获取数据。如果您没有索引,那么它将像整个表一样被锁定,因为它正在做完整的表扫描而不是索引扫描。检查文档哦,好的。。我应该只在表中的一行上使用索引吗?(如“userid”示例)请查看我的更新问题。我已经列出了一个缓慢进程的列表。太好了。当你运行它时,这个数字是多少?从usersOK good中选择count(*)。索引很可能会在10秒内创建。所以我应该在“ID”和“username”上创建索引吗?ALTER TABLE users添加索引id(列名称ASC);和ALTER TABLE users添加索引用户名(列名称ASC);对吗?接近。您需要这样做:ALTER TABLE users添加索引idx\U id(id ASC);和ALTER TABLE users添加索引idx_username(username ASC);