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
相关产品推荐
相关产品推荐

