更新主键索引行的时间缓慢

Slow time updating primary key indexed row

我有一个查询,它使用主键来定位行来更新 table 中的字段。 table 可以包含许多行,其中 date/time 字段最初为 NULL,然后使用 NOW() 用 date/time 戳更新。

当我 运行 table 上的更新语句时,我得到一个慢速查询日志条目(3.38 秒)。日志表明检查了 200,000 行。如果我使用 PK 来识别正在更新的行,为什么要检查那么多行?

主键是 item_id 和 customer_id。我已验证主键在 mySQL table 结构中是正确的。

UPDATE cust_item
   SET status = 'approved',
       lstupd_dtm = NOW()
 WHERE customer_id = '7301'
   AND item_id = '12498';

请问是不是硬件问题

虽然我在评论中提到的更改可能会有所帮助,但实际上,我无法重现此问题...

我有一个大约 100 万行的数据集...:[=​​11=]

CREATE TABLE cust_item
(customer_id INT NOT NULL
,item_id INT NOT NULL
,status VARCHAR(12) NULL
,PRIMARY KEY(customer_id,item_id)
);

-- INSERT some random rows...

SELECT COUNT(*)
     , SUM(customer_id = 358) dense
     , SUM(item_id=12498) sparse 
FROM cust_item;
+----------+-------+--------+
| COUNT(*) | dense | sparse |
+----------+-------+--------+
|  1047720 |   104 |      8 |
+----------+-------+--------+

UPDATE cust_item 
   SET status = 'approved' 
 WHERE item_id = '12498' 
   AND customer_id = '358';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

在没有更新的情况下select记录需要多长时间?

如果 select 很快,那么您需要研究会影响 update/write 速度的因素。

  • table 上的索引太多,不要忘记过滤索引和索引视图
  • 索引页的填充因子为 0,需要拆分以适应数据更改。
  • 带级联的引用约束
  • 触发器
  • 存储级写入速度慢

如果 select 很慢

  • old/bad 指数统计
  • 极度碎片化
  • 具有太多打开行组的列存储索引

如果 select 速度在第一次后显着提高,您可能遇到了一些冷缓冲区性能问题。这也可能指向存储 I/O 问题。

您还可能遇到由另一个进程暂时锁定 table 引起的并发问题。

最后,执行查询的工具是否有可能 return 设置了错误的持续时间?例如,SQL Server Management Studio 偶尔会 return 一个大的结果集,即使服务器处理它的速度非常快。