Mysql 当通过ASC而不是DESC切换到订单时,需要花费很长时间。有什么好处?

Mysql 当通过ASC而不是DESC切换到订单时,需要花费很长时间。有什么好处?,mysql,Mysql,我只是将我的查询从DESC切换到ASC。没有其他变化 我的问题是: SELECT * FROM `conversion_queue` WHERE `processed_date` = '0000-00-00 00:00:00' AND `created` <= DATE_SUB(NOW(), INTERVAL 2 MINUTE) AND `processed_status` = 'QUEUED' ORDER BY `created` ASC LIMIT 1; 有什

我只是将我的查询从
DESC
切换到
ASC
。没有其他变化

我的问题是:

SELECT * FROM `conversion_queue`
WHERE
    `processed_date` = '0000-00-00 00:00:00'
    AND `created` <= DATE_SUB(NOW(), INTERVAL 2 MINUTE)
    AND `processed_status` = 'QUEUED'
ORDER BY `created` ASC
LIMIT 1;

有什么好处?是否有一个额外的索引,我应该添加?这个特定的表有超过一百万行。

我在where子句中没有看到任何关于processed_date和processed_status的索引。您可能希望创建一个包含所有三个索引的索引,并将其作为最后一个索引

DESC之所以更快,可能是因为它可以查看最新创建的索引,并向后扫描创建的索引和获取记录,直到其他两个条件匹配为止。对于升序,它必须从创建的第一个条目开始,向前扫描并获取记录。前面的条目可能都经过了处理,因此在找到匹配项之前,它还有很多要查看的内容

如果您已经创建了覆盖索引“已处理的\u日期”、“已处理的\u状态”,则它可以通过索引查找来查找记录。您可能会发现,即使DESC速度也会随之增加。

这里的问题是

`created` <= DATE_SUB(NOW(), INTERVAL 2 MINUTE)

`created`我想这不会花很长时间,因为我在该列上有一个索引,而且我还有其他标准。我在上面的查询中运行了一个
EXPLAIN()
,对于
可能的键
列,我得到了
创建的
。你对新指数的建议仍然有效吗?是的<代码>创建的
不是此类数据访问的良好索引,除非在索引的前几条记录中完全满足查询约束,从而允许
限制1
终止索引扫描。在
(processed\u date,processed\u status,created)
MySQL可以直接转到与
processed\u date
processed\u status
上的约束匹配的第一条记录。如果第一条记录与创建的
上的约束不匹配,我们就完成了,之后的记录也将不匹配。如果是这样的话,我们可以提供记录并停止。
`created` <= DATE_SUB(NOW(), INTERVAL 2 MINUTE)