You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL 5.7 如何新增字段标记最新精选记录并解决子查询慢问题

MySQL 5.7 高效标记最新Featured记录方案

首先执行语句新增目标字段:

ALTER TABLE 你的实际表名 ADD COLUMN MostRecentFeatured TINYINT(1) DEFAULT 0 NOT NULL;

按业务场景选择更新语句

场景1:全局仅1条最新的Featured=1记录标记为1

UPDATE 你的实际表名 t1
LEFT JOIN (
    SELECT ID FROM 你的实际表名 
    WHERE Featured = 1 
    ORDER BY CreatedAt DESC 
    LIMIT 1
) t2 ON t1.ID = t2.ID
SET t1.MostRecentFeatured = IF(t2.ID IS NOT NULL, 1, 0);

场景2:每个PersonID下各有1条最新的Featured=1记录标记为1(更常用)

UPDATE 你的实际表名 t1
LEFT JOIN (
    SELECT a.ID FROM 你的实际表名 a
    INNER JOIN (
        SELECT PersonID, MAX(CreatedAt) AS max_created
        FROM 你的实际表名
        WHERE Featured = 1
        GROUP BY PersonID
    ) b ON a.PersonID = b.PersonID AND a.CreatedAt = b.max_created
    WHERE a.Featured = 1
) t2 ON t1.ID = t2.ID
SET t1.MostRecentFeatured = IF(t2.ID IS NOT NULL, 1, 0);

性能优化建议

  • 提前创建联合索引INDEX idx_feature_person_created(Featured, PersonID, CreatedAt),子查询的过滤、分组、排序逻辑都可直接走索引,避免全表扫描
  • 若表数据量超过百万级,可按ID范围分批次执行更新,避免长时间锁表影响线上业务
  • 若该标记仅为查询使用无需持久化存储,可不用新增字段,直接在业务查询语句中嵌入关联逻辑获取标记,省去每次Featured字段更新后重刷标记的成本

性能优于普通子查询的原因

常规的每行关联子查询方案会为每条表记录执行一次子查询匹配,时间复杂度为O(n²),数据量越大性能衰减越严重。本方案先一次性计算出所有需要标记为1的ID集合,再做一次全表关联更新,时间复杂度为O(n),性能提升非常明显。

内容的提问来源于stack exchange,提问作者William Martins

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 23:15:07