【问题标题】:MySQL using multiple indexes on order byMySQL按顺序使用多个索引
【发布时间】:2012-12-26 17:51:40
【问题描述】:

我有一个使用 order by 将数据返回到用户界面的系统;用户可以按任意顺序从十几个不同的排序选项中进行选择。

我有问题

explain extended select t.* from task t order by create_date, due_date limit 5;

+------+-------------+-------+------+---------------+------+---------+------+--------+----------+----------------+
| id   | select_type | table | type | possible_keys | key  | key_len | ref  | rows   | filtered | Extra          |
+------+-------------+-------+------+---------------+------+---------+------+--------+----------+----------------+
|    1 | SIMPLE      | t     | ALL  | NULL          | NULL | NULL    | NULL | 331233 |   100.00 | Using filesort |
+------+-------------+-------+------+---------------+------+---------+------+--------+----------+----------------+
1 row in set, 1 warning (0.00 sec)

我有一个关于 create_date 和 due_date 的索引。我知道我可以创建一个多列索引;但是,由于大约有 12 种不同的排序选项,这意味着我必须创建一百多个索引才能涵盖所有场景。

我阅读了有关索引合并的信息,我相信这会解决问题,因为我可以为您可以排序的每一列创建一个索引,但是我似乎无法让它在“排序依据”部分工作查询。

【问题讨论】:

  • 您有实际问题吗?

标签: mysql sql indexing mariadb


【解决方案1】:

即使没有索引,DBMS 也能很好地进行排序。请记住,额外的索引会减慢更新操作的速度,因此肯定会出现表上的“索引过多”这样的情况。

如果查询复杂,不能保证数据可以使用索引呈现,或者使用索引是最快的查询计划。

例如,您可能在 ColumnA 上有一个非常好的过滤条件(它只选择表中百万行的 1/1000),而您想对 ColumnB 和 ColumnC 进行排序。在这种情况下,优化器可能会使用 ColumnA 上的索引并对 1000 个结果行进行排序,而不是按照 ColumnB 和 ColumnC 上的索引顺序读取整个 1,000,000 行表并在 1000 行中选择满足过滤条件。

通常,优化器比你更清楚。不总是;实施中甚至偶尔会出现错误,有时甚至会出现疏忽。但是作为第一条经验法则,除非您可以重写查询以从根本上更快地获得相同的结果,否则优化器可能会做得不错。 (如果你可以重写查询并更快地得到结果,那么优化器已经把它搞砸了,你已经有了一个很好的 bug 报告基础。)

【讨论】:

    【解决方案2】:

    你唯一能做的就是强制索引

    为 order by 强制索引 index_name

    如果你想利用索引合并 然后尝试使用联合,或等,这将使您使用多索引

    请记住,当两个条件相互独立时,将使用多重索引,那么只有它才会起作用

    在极少数情况下可以使用多索引

    (对于上面的查询,我确信它不会工作)

    【讨论】:

      【解决方案3】:

      试试这个解决方法:

      explain extended select * from (select t.* from task t order by create_date limit 30) z order by create_date, due_date limit 5;
      

      当您的所有行都在前 30 行内时,它可以工作,同时使用第一顺序。

      “技巧”是从主表中选择一个简单的查询,并在 30 行集合上执行更大的操作(连接、高级订单、随机等),这比使用整个 330K 行表要快。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-11-18
        • 1970-01-01
        • 2019-07-18
        • 2011-06-14
        • 1970-01-01
        • 2017-02-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多