调度任务中预加载User与Property透视表是否更高效?
针对你的问题,核心要在存储成本和查询效率之间做权衡,结合你提到的Properties表查询慢的现状,给你几个实际的方向:
优先优化
Properties表的基础查询能力
既然Properties表本身查询慢,先从根源解决:给Postcode Sector字段加单独索引,或者结合常用的筛选/查询字段建联合索引(比如如果经常按片区+价格范围查询,就建postcode_sector, price的联合索引);查询时避免用SELECT *,只取业务需要的列,减少数据传输和磁盘IO开销。这一步是基础,不管用不用透视表都得做。不要存全量数据的透视表,只存关联ID
如果要做User和Property的关联存储,绝对不要把Properties的30+列都复制到透视表里——这会让透视表体积爆炸,完全没必要。只存user_id和property_id的关联关系就行,这样透视表的体积会非常小,写入和查询都快。后续需要用户的房产数据时,先通过透视表拿到property_id列表,再用主键批量查询Properties表(主键查询是数据库最快的操作之一),比直接按Postcode Sector查原表高效得多。评估夜间任务的执行成本
每日夜间任务生成用户房产子集时,可以顺便把user_id和property_id的关联关系写入透视表——相当于把“按片区查Properties”的开销集中在夜间低峰期,而不是用户访问的高峰期。如果夜间任务的执行时间在可接受范围内(比如几小时内完成),这种预存储关联关系的方式能极大提升白天用户查询的响应速度。极端情况的备选方案
如果Properties表实在太大,即使加了索引还是慢,且用户的房产子集更新频率低(每日一次足够),可以考虑直接把用户的房产子集(只存需要的列)作为单独的用户专属表或者分区存储,彻底避免查询大表。但这种方案的存储成本会高一些,适合用户数量不多但每个用户的房产子集很大的场景。
内容的提问来源于stack exchange,提问作者Matthew Bradley

