2

我有一张有 50-100k 行的表。我有一个自动增量 ID 字段和另一个名为 Main_Port 的字段。

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

我现在使用的是:

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

这是最好的方法吗?

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

4

5 回答 5

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,如果你真的想深入挖掘,你会想要具体化一个摘要视图。这是对物化视图机制的一个不错的解释

于 2012-05-10T12:56:19.427 回答
2
SELECT MANIFEST_ID FROM MANIFEST_MSS.dbo.Manifest where Main_Port = x ORDER BY MANIFEST_ID DESC LIMIT 1

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

于 2012-05-10T12:55:50.313 回答
2

如果需要,您可以使用 Order By 来完成,尽管使用 MAX 很好。

SELECT MANIFEST_ID FROM MANIFEST_MSS.dbo.Manifest where Main_Port = x ORDER BY MANIFEST_ID DESC LIMIT 1
于 2012-05-10T12:55:51.860 回答
2

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

我会这样做:

SELECT *
FROM MANIFEST_MSS.dbo.Manifest
where Main_Port = x limit 1
order by ID desc
于 2012-05-10T12:56:43.773 回答
1

如果您的 Manifest_ID 列是自动增量列,那么您也可以实现以下查询:

 SELECT TOP 1 MANIFEST_ID FROM MANIFEST_MSS.dbo.Manifest WHERE Main_Port = X order by    MANIFEST_ID DESC
于 2012-05-10T12:56:56.240 回答