【问题标题】:Is there a way to select the maximum row id in MySQL without scanning all rows with MAX()?有没有办法在不使用 MAX() 扫描所有行的情况下选择 MySQL 中的最大行 ID?
【发布时间】:2011-05-27 12:00:23
【问题描述】:

我使用以下查询来获取一组行的最高 id,但由于在某些情况下,该组中有数万或数十万行,使得查询效率非常低。有没有办法以更有效的方式完成相同的结果?

SELECT MAX(id) FROM table WHERE groupID = '12345'

【问题讨论】:

  • 你试过EXPLAIN SELECT ...吗?你的桌子上有什么索引?
  • 是的,我在 groupID 上有一个索引。表本身有数百万行,因此索引将其缩小到该特定组中的行,但该组仍可能有几十万行。

标签: sql mysql query-optimization


【解决方案1】:

如果该列是自动编号标识列,您可以执行以下操作:

 IDENT_CURRENT('table')

但这可能会被击中或错过。如果您将它与 where 一起使用,我怀疑它会得到您想要的。

干杯,

【讨论】:

  • 这不起作用,因为特定组的最大 id 通常不会是最后插入的行。
  • 是的,我认为你的 where 子句会把它扔掉。我不确定你有什么比 max 更好的选择。我无法想象 id 排名前 1 的订单会更好。
【解决方案2】:

备用查询

SELECT * FROM table WHERE groupID = '12345' ORDER BY id DESC LIMIT 1;

【讨论】:

  • 这仍然会扫描每一行,因为它必须进行文件排序。
【解决方案3】:

我相信即使 ORDER BY id 并选择 LIMIT 1 个出现的 groupid 会更快,但是当您按键排序并获取另一个常量键时 MySQL 不能使用索引,因为它仍在读取每一行.

如果您按 groupid 排序(asc 或 desc),该 groupid 中的第一条或最后一条记录总是最高的 id 吗?那么您最快的查询将是按 groupid 排序并为该 groupid 中列出的第一条记录选择 LIMIT 1。

【讨论】:

  • 这将是第一个,但我不知道这会如何更快。 EXPLAIN 仍然显示它返回与使用 MAX 相同的行数。
【解决方案4】:

丑陋的解决方法是在groupID, id上添加一个索引

alter table `table` add index groupId_with_id_idx (groupId, id);
desc SELECT MAX(id) FROM table use index (groupId_with_id_idx) WHERE groupID=12345;
/* the execution plan should return "Select tables optimized away" */

What is Select tables optimized away?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-10-06
    • 1970-01-01
    • 1970-01-01
    • 2021-07-23
    • 1970-01-01
    • 1970-01-01
    • 2017-12-27
    相关资源
    最近更新 更多