优化查询:在自身上加入表

Posted

技术标签:

【中文标题】优化查询:在自身上加入表【英文标题】:Optimizing a query : joining a table on itself 【发布时间】:2013-04-09 09:34:00 【问题描述】:

我想在一个查询中获取表的最后两行作为新数据和以前的数据

我明白了

 select tbl.x , tbl2.x as last_x 
 from tbl left join tbl tbl2 ON tbl.id!= tbl2.id
 order by tbl.id desc , tbl2.id desc limit 1

它工作正常,但我认为它在大型数据库中可能会变慢

有什么办法可以加快速度吗?

【问题讨论】:

你能提供样本记录吗? @max 我疯了吗?为什么SELECT * FROM tbl ORDER BY id DESC LIMIT 2 不成功? @tombom - 我认为他希望在一条记录中返回两行的一些详细信息。 【参考方案1】:

LIMIT 应该在基本子查询中起作用,因此以下可能会更有效

SELECT Sub1.x , Sub2.x as last_x 
FROM (SELECT x FROM tbl ORDER BY tbl.id DESC LIMIT 1) Sub1
CROSS JOIN (SELECT x FROM tbl ORDER BY tbl.id DESC LIMIT 2, 1) Sub2

【讨论】:

【参考方案2】:

您可以查看execution plan 并尝试优化您的查询,但通常您会在遇到问题时这样做,以便确定哪些部分需要很长时间。

将此线程发送至:How to optimise mysql queries based on EXPLAIN plan

但正如我所说,我不会尝试解决仍然不存在的问题,我实际上并没有看到您的查询有问题。

【讨论】:

以上是关于优化查询:在自身上加入表的主要内容,如果未能解决你的问题,请参考以下文章

(VIP-朝夕教育)2021-06-05 .NET高级班 36-数据库优化(数据库自身的优化,数据库表优化,程序操作优化)

使用奇怪的查询优化器行为加入 SQL Server 中的视图

您如何优化连接自身并执行“自定义”分组的 MySQL 查询?

Oracle 优化——奇怪的执行计划左加入一个不相关的子查询

使用表函数优化多个连接

使用范围标准对连接表进行 MySQL 优化