使用join,where,group by和count来加速查询

时间:2010-08-20 18:48:31

标签: sql mysql join

我有一个基本查询,即使在小表(<100,000行)上执行也需要很长时间:

select images.classification, count(boxes.id)
from images
join boxes on images.id = boxes.image_id
where boxes.round = 0
group by images.classification;

我有关于boxes.round,boxes.image_id和images.classification的索引(此查询中只有varchar)。 box.id和images.id上的主键。解释表明它正在利用boxes.round索引。额外的是:Using where; Using temporary; Using filesort

是否可以加快此查询?怎么样?

如果重要,服务器是MySQL 5.1,全部都带有MyISAM表。

(此问题类似于How to speed up "select count(*)" with "group by" and "where"?


完整解释输出:

mysql> explain select images.classification, count(boxes.id) from images join boxes on images.id = boxes.image_id where boxes.round = 0 group by images.classification;

|  1 | SIMPLE      | boxes  | ref    | ix_boxes_image_id,ix_boxes_round | ix_boxes_round | 5       | const                       | 64162 | Using where; Using temporary; Using filesort |
|  1 | SIMPLE      | images | eq_ref | PRIMARY                                        | PRIMARY               | 4       | vatic.boxes.image_id |     1 |                                              |

3 个答案:

答案 0 :(得分:2)

(images.id, images.classification)上添加一个索引 - 应该给你

  • 联接的索引。你已经通过主键获得了这个,但你也会得到:
  • 可用作覆盖索引的相同索引
  • 分组子句的相同索引

还在(boxes.image_id,boxes.round)上添加索引:

  • JOIN的索引
  • 涵盖COUNT的索引(见下文)

关于COUNT条款:如果NULL中没有boxes.id(假设没有),您可以将其替换为COUNT(boxes.image_id),这样我们就可以获得一些从prev的索引中使用更多。段落。

再次,请使用EXPLAIN进行验证,但我会说这些步骤可以为您提供更好的执行计划。

答案 1 :(得分:0)

images.id添加索引。

答案 2 :(得分:0)

对images.classification使用整数而不是varchar吗?

是否可行