【问题标题】:Search by primary key and then sort按主键搜索然后排序
【发布时间】:2013-10-03 23:11:07
【问题描述】:

我正在使用 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;

但不幸的是,我似乎无法从中获得良好的表现。它总是不得不求助于文件排序。有没有办法通过这种设置获得更好的性能,还是我需要考虑使用不同的数据库?

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 我明白为什么它不起作用。我想知道这个查询中是否有一个索引可以同时满足WHERE和ORDER BY。
    【解决方案2】:

    为了获得优化的查询以像这样获取和检索,您需要有一个按排序排序的键,然后是主键,如下所示:

    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;
    

    这将给出一个只使用索引进行搜索/排序的查询。

    【讨论】:

      猜你喜欢
      • 2014-04-07
      • 2020-10-21
      • 1970-01-01
      • 2016-02-15
      • 2016-11-03
      • 1970-01-01
      • 1970-01-01
      • 2021-11-22
      • 2014-01-18
      相关资源
      最近更新 更多