当前位置: 首页 > 面试题库 >

等待MySQL表上的表级别锁定

傅安宁
2023-03-14
问题内容

最近几天,随机地,我的网站变得非常缓慢。我开始尽力调查。我看到MySQL进程正在使用服务器可用内存的85%-95%(我也应该升级我的内存吗?)。

我检查了我的MySQL进程日志,发现有很多查询,其中包括:

等待表级锁定

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

我还有20个其他表,它们具有不变的查询,但是我在列表中没有看到它们。.所以我猜问题出在users表上吗?

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

我也跑了这个:

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 |

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


问题答案:

在较慢的时段之一中,运行以下命令:

show processlist;

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

添加索引如下所示:

 ALTER TABLE MYTABLE ADD INDEX idx_columnname (COLUMN_NAME ASC) ;

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



 类似资料:
  • 这是我的servlet的doPost方法,理论上它在db中添加数据 这里是在db中插入数据的方法 但是,当我尝试使用servlet执行此操作时,出现了以下错误 错误1205(HY000):超出锁定等待超时; 有人知道如何解决?如果我对一个普通的java类做同样的事情,那么一切都很好。

  • 我已经阅读了大约4个级别的隔离: 我想了解每个事务隔离在表上使用的锁 以下是事务隔离中可能出现的三种现象 脏读取-无锁定 不可重复读取-无脏读取作为对提交数据的锁定 幻影读取-锁定sql块(使用select query选择) 我想了解我们在哪里定义这些隔离级别:仅在jdbc/hibernate级别或在DB中定义 PS:我已经浏览了oracle中隔离级别的链接,但是它们看起来很笨拙,而且只针对数据库

  • 本文向大家介绍检查事务列表以等待锁定SAP HANA,包括了检查事务列表以等待锁定SAP HANA的使用技巧和注意事项,需要的朋友参考一下 M_BLOCKED_TRANSACTIONS系统视图用于提供等待锁定的事务列表。 您可以在编辑器中运行以下SQL查询- SAP HANA中M_BLOCKED_TRANSACTIONS系统视图下的详细信息

  • 问题内容: 在Java线程转储中,您可以看到堆栈跟踪中提到的锁。 似乎有三种信息: 1: 2: 3: 1:线程已获得对象0x00002aab329f7fa0的锁。 2&3:似乎是说线程正在等待该对象上的锁可用… 但是2和3有什么区别? 问题答案: 使用内在锁时,您将在线程转储中获得“等待锁”,而使用java.util.concurrent中的锁时,将获得“停放以等待”。考虑以下示例: 随着您将获得

  • 本文向大家介绍MySQL 行锁和表锁的含义及区别详解,包括了MySQL 行锁和表锁的含义及区别详解的使用技巧和注意事项,需要的朋友参考一下 一、前言 对于行锁和表锁的含义区别,在面试中应该是高频出现的,我们应该对MySQL中的锁有一个系统的认识,更详细的需要自行查阅资料,本篇为概括性的总结回答。 MySQL常用引擎有MyISAM和InnoDB,而InnoDB是mysql默认的引擎。MyISAM不支