我们使用下面的select查询很长时间了。但是今天我们在数据库上收到了很多锁。
请帮助我如何解决由于select查询而导致的锁定。
桌子很小,只有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)
发布于 2013-12-06 04:27:22
假设你知道FOR UPDATE
是什么意思。名字是DEFAULT NULL
有什么原因吗?如果没有,我想命名为主键。Innodb的PK是集群的,所以它使得access 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);
发布于 2013-12-06 04:30:42
如果要锁定表的某些行,则必须在完成工作后显式解锁该表。
用途:解锁表;
或者使用: kill 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/
https://stackoverflow.com/questions/20415828
复制