mysql命令由-id vs命令由id desc命令

Piy*_*usG 15 mysql database-performance

我希望从1M行的表中获取最后10行.

CREATE TABLE `test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `updated_date` datetime NOT NULL,
  PRIMARY KEY (`id`)
)
Run Code Online (Sandbox Code Playgroud)

这样做的一种方法是 -

select * from test order by -id limit 10;

**10 rows in set (0.14 sec)**
Run Code Online (Sandbox Code Playgroud)

另一种方法是 -

select * from test order by id desc limit 10;

**10 rows in set (0.00 sec)**
Run Code Online (Sandbox Code Playgroud)

所以我对这些查询进行了"解释" -

以下是我使用'order by desc'的查询结果

EXPLAIN select * from test order by id desc limit 10;
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

以下是我使用'order by -id'的查询结果

EXPLAIN select * from test order by -id limit 10;
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

我认为这将是相同的,但似乎执行计划存在差异.

Nic*_*aro 18

RDBMS使用启发式方法来计算执行计划,它们不能总是确定两个语句的语义等价,因为它是一个太难的问题(在理论和实际复杂性方面).

所以MySQL无法使用索引,因为你没有"-id"的索引,这是一个应用于字段"id"的自定义函数.看似微不足道,但RDBMS必须最大限度地减少计算计划所需的时间,因此他们会遇到简单的问题.

当无法为查询找到优化(即使用索引)时,系统将回退到在任何情况下都有效的实现:扫描整个表.