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中文网其他相关文章!