更新主键索引行的时间缓慢
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 一个大的结果集,即使服务器处理它的速度非常快。
我有一个查询,它使用主键来定位行来更新 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 一个大的结果集,即使服务器处理它的速度非常快。