【问题标题】:getting locks on table due to select queries?由于选择查询而锁定表?
【发布时间】:2013-12-06 04:12:27
【问题描述】:

我们长期使用以下选择查询。 但是今天我们收到了很多数据库锁。

请帮助我如何解决由于选择查询而导致的锁定。

表格大小非常小,只有 300kb。

我们优化了表格,但没有运气

从下面查询信息和表结构。

Req-SQL:[select max(fullname) from prod_sets where name='view_v01' for update] 
Req-Time: 5 sec 
Blocker-SQL:[] 
Blocker-Command:[Sleep] 
Blocker-Time: 73 sec

Req-SQL:[select max(fullname) from prod_sets where name='view_v01' for update] 
Req-Time: 22 sec 
Blocker-SQL:[] 
Blocker-Command:[Sleep] 
Blocker-Time: 73 sec

CREATE TABLE `prod_sets` (
  `modified` datetime DEFAULT NULL,
  `create` datetime DEFAULT NULL,
  `name` varchar(50) COLLATE latin1_bin DEFAULT NULL,
  `fullname` decimal(12,0) DEFAULT NULL,
  UNIQUE KEY `idx_n` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_bin

解释计划:

mysql> explain select max(fullname) from prod_sets where name='view_v01' for update;
+----+-------------+---------------+-------+---------------+----------+---------+-------+------+-------+
| id | select_type | table         | type  | possible_keys | key      | key_len | ref   | rows | Extra |
+----+-------------+---------------+-------+---------------+----------+---------+-------+------+-------+
|  1 | SIMPLE      | prod_sets     | const | idx_name      | idx_name | 53      | const |    1 |       |
+----+-------------+---------------+-------+---------------+----------+---------+-------+------+-------+
1 row in set (0.01 sec)

【问题讨论】:

  • 尝试使用LOCK IN SHARE MODE。即使没有索引,查询也应该只需要 300kb db 中的微秒。

标签: mysql sql locking database-locking


【解决方案1】:

如果您要锁定表的某些行,那么您必须在工作完成后显式解锁该表。

使用: 解锁表格;

或使用: 杀死 put_process_id_here;

请参阅这些链接以进一步阅读

http://dev.mysql.com/doc/refman/5.0/en/lock-tables.html

http://lmorgado.com/blog/2008/09/10/mysql-locks-and-a-bit-of-the-query-cache/

【讨论】:

    【解决方案2】:

    假设您知道FOR UPDATE 的含义。名字是DEFAULT NULL有什么原因吗?如果没有,我想命名 PRIMARY KEY。 Innodb的PK是集群的,所以访问fullname更快

    CREATE TABLE `prod_sets` (
      `modified` datetime DEFAULT NULL,
      `create` datetime DEFAULT NULL,
      `name` varchar(50) COLLATE latin1_bin DEFAULT NOT NULL,
      `fullname` decimal(12,0) DEFAULT NULL,
      PRIMARY KEY `idx_n` (`name`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_bin
    

    或者简单地添加以下索引。

    ALTER TABLE prod_sets ADD INDEX(name, fullname);
    

    【讨论】:

      猜你喜欢
      • 2012-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-29
      • 2019-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多