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必须最大限度地减少计算计划所需的时间,因此他们会遇到简单的问题.
当无法为查询找到优化(即使用索引)时,系统将回退到在任何情况下都有效的实现:扫描整个表.