我必须计算 table2 中的数字在 table2.a 和 table2.b 范围内的数字之间出现了多少次
即我们想知道这样的情况发生了多少次:a < start < b
我运行了以下查询:
UPDATE table2
SET occurrence =
(SELECT COUNT(*) FROM table1 WHERE start BETWEEN table2.a AND table2.b);
table2
ID a b occurrence
1 1 10
2 1 20
3 1 25
4 2 30
table1
ID start col1 col2 col3
1 1
2 7
3 10
4 21
5 25
6 27
7 30
表2为
- 关于 a、b 和出现次数的 3 个索引
- 1567 行(因此我们将在 table2 上 SELECT COUNT(*) 1567 次..)
- ID 列作为 PK
表1为
- 开始时有 1 个索引
- 42,000,000 行
- 列开头“按列开头排序”
- ID 列作为 PK
==> 花了2.5小时才完成其中的2/3。我需要加快速度...有什么建议吗? :)
最佳答案
您可以尝试将 id 列添加到表 1 的索引中:
CREATE INDEX start_index ON table1 (start,id);
并将查询重写为
UPDATE table2
SET occurrence =
(SELECT COUNT(id) FROM table1 WHERE start BETWEEN table2.a AND table2.b);
这称为“覆盖索引”:http://www.simple-talk.com/sql/learn-sql-server/using-covering-indexes-to-improve-query-performance/
-> 对表 1 的整个查询可以通过索引中的数据进行服务 -> 无需对实际记录进行额外的页面查找。
关于mysql - 使用 select count(*) 更新查询速度较慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7330681/