mysql - 使用 select count(*) 更新查询速度较慢

标签 mysql performance select count indexing

我必须计算 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/

相关文章:

mysql - 哪些特殊情况不应关闭语句?

sql - 合并结果或留给客户端浏览器 javascript 的高效 SQL?

python - 有没有更好的方法来删除长度等于或高于阈值的连续零部分?

mysql - 涉及 SET 数据类型的 Select 语句

c# - 右键单击以选择列表框中的项目

php - 随机且唯一的 Mysql 选择查询

c++ - centos 6 中的 mysql 连接器 cpp undefined reference

mysql - SELECT ... FOR UPDATE from one table in multiple threads

php - 论坛响应错误: Duplicate entry for PRIMARY key

css - 使用 CSS 子选择器会更快吗?