具有两列的ORDER BY比任一列上的ORDER BY慢得多

时间:2014-09-29 03:47:18

标签: sql postgresql

我的架构看起来像这样:

create table image_tags (
    image_tag_id serial primary key,
    image_id int not null
);

create index on image_tags(image_id);

当我使用两列执行查询时,它的速度非常慢(例如select * from image_tags order by image_id desc, image_tag_id desc limit 10;)。如果我在排序中删除其中一列(并不重要),那就超级快了。

我在两个查询中都使用了explain,但它并没有帮助我理解为什么order by子句中的两列很慢,它只是告诉我使用两列的速度有多慢

3 个答案:

答案 0 :(得分:3)

要通过索引优化order by image_id desc, image_tag_id desc排序,您需要拥有此索引:

create index image_tags_id_tag on image_tags(image_id, image_tag_id);

只有一个复合索引(我假设的例外情况很少,但在这种情况下不是这样)会帮助优化器立即使用它来确定订单。

答案 1 :(得分:1)

您只有一个与您要执行的查询关联的列的索引,为了更快的速度,您应该创建一个双列索引,例如

create index on image_tags(image_id, image_tag_id);

答案 2 :(得分:1)

create index on image_tags(image_id, image_tag_id);

尝试编制索引..