为什么这个查询很慢?我应该在这里使用MyISAM而不是InnoDB吗?

时间:2010-03-02 00:13:39

标签: mysql innodb myisam record-locking

我在慢速查询日志中每小时收到5次这样的内容:

# Query_time: 11.420629  Lock_time: 0.000033 Rows_sent: 0  Rows_examined: 0
SET timestamp=1267487708;
INSERT INTO record_lock (record_lock.module_id, record_lock.module_record_id, record_lock.site_id, record_lock.user_id, record_lock.expiration_date_time, record_lock.date_time_created) VALUES ('40', '12581', '940', '155254', '2010-03-02 00:24:57', '2010-03-01 23:54:57');

# Query_time: 2.095374  Lock_time: 0.000031 Rows_sent: 0  Rows_examined: 0
SET timestamp=1267488361;
DELETE
FROM record_lock
WHERE record_lock.user_id = 221659 AND record_lock.expiration_date_time IS NOT NULL;

record_lock表目前使用的是InnoDB,它现在有十几条记录。

我们的系统中有数千名活跃用户。每次他们编辑记录时,我们都会插入此表。并且在每个页面加载系统中的任何一个页面时,我们1)从表中选择以查看当前用户是否有任何锁定; 2)如果有用户的任何记录,则对该表运行DELETE查询,引用表的WHERE子句中的主键。

这是表的架构:

CREATE TABLE IF NOT EXISTS `record_lock` (
  `module_id` int(10) unsigned NOT NULL,
  `module_record_id` int(10) unsigned NOT NULL,
  `site_id` int(10) unsigned NOT NULL,
  `user_id` int(10) unsigned NOT NULL,
  `expiration_date_time` datetime NOT NULL,
  `date_time_created` datetime DEFAULT NULL,
  PRIMARY KEY (`module_id`,`module_record_id`),
  KEY `record_lock_site_id` (`site_id`),
  KEY `index_user_id` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

4 个答案:

答案 0 :(得分:2)

你每秒要做多少次查询?

你能不能把锁定的字段放在记录中?无论如何,我假设你正在获得记录。您还可以使用memcached之类的东西来存储锁。

我不知道我的头脑中的具体细节,但我的理解是InnoDB非常适合并发读取,但对于并发写入很糟糕。 MyISAM可能会更好,但我的直觉告诉我当前的设计存在缺陷。

答案 1 :(得分:1)

您是否尝试过对查询运行EXPLAIN?

答案 2 :(得分:1)

是否有太多连接试图击中同一张桌子?您可以尝试在user_id上对表进行分段以帮助解决这个问题。

答案 3 :(得分:0)

启用Innodb显示器有助于缩小性能不佳的原因:

SHOW ENGINE INNODB STATUS and the InnoDB Monitors