SQL选择符合条件的最大ID

时间:2012-05-10 12:52:20

标签: mysql sql select

我有一张50-100k行的表。我有一个自动增量ID字段,另一个字段叫做Main_Port。

我想选择Main_Port = x的最后一个ID。我希望它有效率。

我现在正在使用的是:

SELECT max(MANIFEST_ID)FROM MANIFEST_MSS.dbo.Manifest where Main_Port = x

这是最好的方法吗?

该表有可能增长到500k +行

5 个答案:

答案 0 :(得分:3)

在不了解您的数据结构和索引结构的情况下,很难说“这将是有效的。您使用的查询:

SELECT max(MANIFEST_ID)
FROM   MANIFEST_MSS.dbo.Manifest 
WHERE  Main_Port = x

可能非常有效,取决于....

  • Manifest.MainPort上有索引吗?或(Manifest.MainPort,ManifestID desc)?
  • 我们在Main_Port上讨论什么样的密度?意思是,对于给定的main_port,有多少个不同的清单ID?

要添加一些透视图,在数据库术语中,500k行并不是那么大。你已经在这里看到了一些关于查询的变化,一个可能比另一个略快,但真正的速度将归结为具有良好的索引(Main_Port,ManifestID desc)。 Alternatley,如果你真的想深入挖掘,你会想要实现一个摘要视图。这是物化视图的decent explanation机制。

答案 1 :(得分:2)

SELECT MANIFEST_ID FROM MANIFEST_MSS.dbo.Manifest where Main_Port = x ORDER BY MANIFEST_ID DESC LIMIT 1

似乎是另一种方式,但我不知道它是否会比你的更有效

答案 2 :(得分:2)

如果你愿意,你可以使用Order By来做,虽然使用MAX很好。

SELECT MANIFEST_ID FROM MANIFEST_MSS.dbo.Manifest where Main_Port = x ORDER BY MANIFEST_ID DESC LIMIT 1

答案 3 :(得分:2)

MAX不会给你最后一个,它会给你更大的价值。这很糟糕,因为它必须扫描所有行以获得更大的值。

我会这样做:

SELECT *
FROM MANIFEST_MSS.dbo.Manifest
where Main_Port = x limit 1
order by ID desc

答案 4 :(得分:1)

您的清单ID列是自动增量列,那么您也可以在下面查询:

 SELECT TOP 1 MANIFEST_ID FROM MANIFEST_MSS.dbo.Manifest WHERE Main_Port = X order by    MANIFEST_ID DESC