我正在使用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;
但不幸的是,我似乎无法从中获得良好的表现。它总是必须诉诸文件。有没有办法从这个设置中获得更好的性能,还是我需要考虑不同的数据库?
答案 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;
这将提供仅使用索引进行搜索/排序的查询。