MySQL单查询获取多唯一section值的最新记录
高效获取MySQL中多个section的最新访问日志条目
你完全可以用单条高效SQL实现需求,不需要导出整张表再在PHP里处理,下面是两种最优方案,性能拉满:
方案一:子查询关联(兼容所有MySQL版本)
利用主键id的唯一性(假设是自增主键,最新记录对应最大id),先找出目标section的最大id,再关联原表获取完整记录:
SELECT t.* FROM your_table t INNER JOIN ( SELECT section, MAX(id) AS max_id FROM your_table WHERE section IN ('main', 'settings', 'xxx') -- 填入需要查询的section列表 GROUP BY section ) AS sub ON t.id = sub.max_id
性能优化关键:
给section和id创建联合索引,让查询能快速定位目标数据,避免全表扫描:
CREATE INDEX idx_section_id ON your_table(section, id DESC);
方案二:窗口函数(MySQL 8.0+)
如果你的MySQL版本是8.0及以上,用窗口函数的代码更简洁,性能同样出色:
SELECT * FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY section ORDER BY id DESC) AS rn FROM your_table WHERE section IN ('main', 'settings', 'xxx') ) AS t WHERE rn = 1;
性能优化关键:
同样依赖上面提到的idx_section_id联合索引,MySQL会利用索引快速完成分组排序,只保留每组的第一条记录。
这两种方案的优势
- 避免多次查询的连接开销,单条查询即可覆盖所有目标section
- 不会拉取无关数据,仅返回每个section的最新一条记录,数据传输量极小
- 基于索引的定位逻辑,查询速度极快,完全不用担心性能瓶颈
内容的提问来源于stack exchange,提问作者John Smith
相关产品推荐
相关产品推荐

