我正在使用 MySQL 5.5。
我有一个 InnoDB 表定义如下:
CREATE TABLE `table1` (
`col1` int(11) NOT NULL AUTO_INCREMENT,
`col2` int(11) DEFAULT NULL,
`col3` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`col4` int(11) DEFAULT NULL,
`col5` datetime DEFAULT NULL,
`col6` tinyint(1) NOT NULL DEFAULT '0',
`col7` datetime NOT NULL,
`col8` datetime NOT NULL,
`col9` int(11) DEFAULT NULL,
`col10` tinyint(1) NOT NULL DEFAULT '0',
`col11` tinyint(1) DEFAULT '0',
PRIMARY KEY (`col1`),
UNIQUE KEY `index_table1_on_ci_ai_tn_sti` (`col2`,`col4`,`col3`,`col9`),
KEY `index_shipments_on_applicant_id` (`col4`),
KEY `index_shipments_on_shipment_type_id` (`col9`),
KEY `index_shipments_on_created_at` (`col7`),
KEY `idx_tracking_number` (`col3`)
) ENGINE=InnoDB AUTO_INCREMENT=7634960 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
问题是更新。该表中大约有 200 万行。
典型的 UPDATE 查询是:
UPDATE table1 SET col6 = 1 WHERE col1 = 7634912;
我们在这个生产服务器上有大约 5-10k QPS。通过进程列表查看时,这些查询通常处于“正在更新”状态。 InnoDB 锁显示 index_table1_on_ci_ai_tn_sti
上有很多 rec 但没有 gap 锁。没有事务在等待锁定。
我的感觉是唯一索引导致了延迟,但我不确定原因。这是我们唯一使用唯一索引以这种方式定义的表。
最佳答案
我认为 UNIQUE
键没有任何影响(在这种情况下)。
您真的将 DATETIME
设置为“1”吗? (请检查是否有其他错别字——它们可能会造成很大的不同。)
您是否尝试每秒执行 10K UPDATEs
?
innodb_buffer_pool_size
是否大于表,但不超过可用 RAM 的 70%?
innodb_flush_log_at_trx_commit
的值是多少? 1 是默认且安全的,但比 2 慢。
你能把一堆更新放到一个事务中吗?这将减少交易开销。
关于mysql - 单条记录按主键更新慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30173680/