按主键搜索然后排序

时间:2013-10-03 23:11:08

标签: mysql performance sql-order-by primary-key

我正在使用MySQL,我有一个数据库,我正在尝试将其用作我将存储在不同索引中的数据的规范版本。这意味着我必须能够通过主键快速从中检索一组数据,但我还需要在出路时对其进行排序。我无法弄清楚如何让MySQL有效地做到这一点。

我的表格如下:

CREATE TABLE demo.widgets (
    id INT AUTO_INCREMENT,
    -- lots more information I need
    awesomeness INT,
    PRIMARY KEY (id),
    INDEX IDX_AWESOMENESS (awesomeness),
    INDEX IDX_ID_AWESOMENESS (id, awesomeness)
);

我想做一些事情:

SELECT *
FROM demo.widgets
WHERE id IN (
    1,
    2,
    3,
    5,
    8,
    13 -- you get the idea
)
ORDER BY awesomeness
LIMIT 50;

但不幸的是,我似乎无法从中获得良好的表现。它总是必须诉诸文件。有没有办法从这个设置中获得更好的性能,还是我需要考虑不同的数据库?

2 个答案:

答案 0 :(得分:0)

文档ORDER BY Optimization对此进行了解释。特别是,如果用于选择WHERE子句中的行的索引与ORDER BY中使用的索引不同,则它将无法使用ORDER BY的索引。

答案 1 :(得分:0)

为了获得一个优化的查询来获取和检索,你需要有一个按排序排序然后是主要的密钥,如下所示:

create table if not exists test.fetch_sort (
    id int primary key,
    val int,
    key val_id (val, id)
);

insert into test.fetch_sort
values (1, 10), (2, 5), (3, 30);

explain
select *
from test.fetch_sort
where id in (1, 2, 3)
order by val;

这将提供仅使用索引进行搜索/排序的查询。