我正在使用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;
问题是更新。此表中大约有2M行。
典型的UPDATE查询是:
UPDATE table1 SET col6 = 1 WHERE col1 = 7634912;
我们在这台生产服务器上有大约5-10k QPS。这些查询通常在"更新"通过流程列表查看状态。 InnoDB锁显示index_table1_on_ci_ai_tn_sti
上有许多rec但没有间隙锁。没有交易在等待锁定。
我的感觉是,独特指数导致滞后,但我不确定原因。这是我们唯一使用Unique Index以这种方式定义的表。
答案 0 :(得分:0)
我认为UNIQUE
密钥没有任何影响(在这种情况下)。
您是否真的将DATETIME
设置为" 1"? (请检查其他拼写错误 - 他们可以发挥重大作用。)
你是想尝试每秒10K UPDATEs
吗?
innodb_buffer_pool_size
大于表格,但不超过可用内存的70%吗?
innodb_flush_log_at_trx_commit
的价值是多少? 1是默认且安全的,但慢于2。
您可以将一堆更新放入单个交易中吗?这将减少交易开销。