我有一个80000行数据库,结果编号在130000000和168000000之间,结果使用字段pid配对。我需要将行的状态从“ G”更改为“ X”,结果对之间的差值为4300000。
我想出了下面的查询,该查询可以运行,但是速度很慢,可以提高速度吗?
UPDATE table1 SET status = 'X'
WHERE id IN (
SELECT id FROM (
SELECT a.id AS id FROM table1 a, table1 b
WHERE a.result = b.result + 4300000
AND a.pid = b.pid
AND a.result between 130000000 and 168000000
AND a.status = 'G'
) AS c
);
Run Code Online (Sandbox Code Playgroud)
索引是:
table1 0 PRIMARY 1 id A 80233 NULL NULL BTREE
table1 1 id 1 id A 80233 NULL NULL BTREE
table1 1 id 2 result A 80233 NULL NULL BTREE
table1 1 id 3 status A 80233 4 NULL YES BTREE
table1 1 id 4 name A 80233 32 NULL BTREE
table1 1 id 5 pid A 80233 16 NULL BTREE
Run Code Online (Sandbox Code Playgroud)
IN(..)在MySQL子句中使用子查询通常效率低下。相反,您可以使用UPDATE .. JOIN语法重写Update查询,也可以使用“自我连接”:
UPDATE table1 AS a
JOIN table1 AS b
ON b.pid = a.pid
AND b.result = a.result - 4300000
SET a.status = 'X'
WHERE a.result between 130000000 and 168000000
AND a.status = 'G'
Run Code Online (Sandbox Code Playgroud)
为了获得良好的性能(如果我正确理解NLJ(嵌套循环)),则需要两个索引:(status,result)和(pid)。
第一个(复合)索引将用于考虑表别名中的行a。由于我们将范围条件设置为on result,因此最好先进行定义status,否则由于范围条件,MySQL只会result在索引中的字段处停止(如果先定义)。
b使用NLJ算法,第二个索引将用于Joined表别名中的查找。
| 归档时间: |
|
| 查看次数: |
61 次 |
| 最近记录: |