首页 > 数据库 > mysql教程 > MySQL如何高效检索每组中的最后一条记录?

MySQL如何高效检索每组中的最后一条记录?

Susan Sarandon
发布: 2025-01-25 19:42:12
原创
909 人浏览过

How to Efficiently Retrieve the Last Record in Each Group in MySQL?

MySQL:从每个数据组中提取最终条目

频繁的数据库操作涉及检索每个数据组中的最新记录。 虽然 GROUP BY 经常使用,但它可能会导致性能问题。

次优方法

以下查询使用子查询和降序排列,尝试执行此操作:

<code class="language-sql">SELECT
  *
FROM (SELECT
  *
FROM messages
ORDER BY id DESC) AS x
GROUP BY name</code>
登录后复制

此方法效率低下,因为外部查询会扫描每个组的整个表,而不考虑更有效的替代方案。

优化方案(MySQL 8.0)

MySQL 8.0 及更高版本提供了窗口函数来改进分组操作。 ROW_NUMBER() 有效识别每组中的最后一条记录:

<code class="language-sql">WITH ranked_messages AS (
  SELECT m.*, ROW_NUMBER() OVER (PARTITION BY name ORDER BY id DESC) AS rn
  FROM messages AS m
)
SELECT * FROM ranked_messages WHERE rn = 1;</code>
登录后复制

此查询对其组中的每一行进行排名,然后仅从每行中选择排名靠前(最后)的记录。

替代方案(MySQL 8.0 之前)

对于较旧的 MySQL 版本(8.0 之前),此方法适合:

<code class="language-sql">SELECT m1.*
FROM messages m1 LEFT JOIN messages m2
 ON (m1.name = m2.name AND m1.id < m2.id)
WHERE m2.id IS NULL;</code>
登录后复制

这使用 LEFT JOIN 来查找同一组内没有更高 id 的行,从而有效地隔离每个记录中的最后一条记录。

性能注意事项

最佳查询在很大程度上取决于您的数据大小、组分布和现有索引。 对您的具体场景进行基准测试对于选择最有效的解决方案至关重要。

以上是MySQL如何高效检索每组中的最后一条记录?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板