mysql - 单条记录按主键更新慢

标签 mysql sql performance indexing innodb

我正在使用 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/

相关文章:

MYSQL:即使正确添加了索引,仍在使用文件排序,使用临时

performance - 当给定实际运行时时,如何计算运行时间复杂度 (`"O(m )"` ) ?

ios - 用于立即分配变量的 block 的运行时开销

mysql - 从 AngularJS 中的数据库读取

php - CURDATE() 12 月不工作

sql - 如何调整表包含 30,000 多行的 7 表连接 MySQL 计数查询?

javascript - 如何在选择查询中分配字符串变量

mysql - 优化 select 中的派生表

mysql - 连接到 kubernetes mysql 服务时 go-mysql 连接被拒绝

mysql - SQL仅选择列上具有最大值的行