我有一个基本查询,即使在小表(<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 | |
答案 0 :(得分:2)
在(images.id, images.classification)
上添加一个索引 - 应该给你
还在(boxes.image_id,boxes.round)
上添加索引:
关于COUNT
条款:如果NULL
中没有boxes.id
(假设没有),您可以将其替换为COUNT(boxes.image_id)
,这样我们就可以获得一些从prev的索引中使用更多。段落。
再次,请使用EXPLAIN进行验证,但我会说这些步骤可以为您提供更好的执行计划。
答案 1 :(得分:0)
向images.id
添加索引。
答案 2 :(得分:0)
对images.classification使用整数而不是varchar吗?
是否可行