订单表按时间分区,通常是为了让按时间访问的数据范围更清晰,并便于管理历史数据。但查询性能取决于两个独立环节:优化器是否排除了无关分区,以及它在保留的分区内如何访问记录。分区后变慢时,应分别验证这两件事,并把执行计划、实际行数和延迟放在一起分析。分区不会自动让每条查询变快,也不能替代合适的索引。⚙️
分区裁剪是优化器根据查询谓词和分区定义,跳过不可能包含目标记录的分区。若分区键为订单创建时间,查询提供明确的时间范围,通常更容易判断命中哪些分区。反之,只按订单号过滤,即使订单号在业务上对应某一时间段,优化器也不能凭这种关联自行推断分区范围。
在分区列上套函数、让列与参数发生隐式类型转换,或在谓词中使用不利于边界推导的表达式,都可能导致裁剪范围扩大或失效。时间参数的类型、时区语义及范围端点也要与列定义和分区边界一致。🌐
诊断提示:用 EXPLAIN 检查执行计划;在支持的版本中,EXPLAIN PARTITIONS 可辅助观察涉及的分区。先确认计划实际列出的分区,再判断索引。不同版本的输出字段可能不同,应结合本机版本文档解读。📝
裁剪后,查询仍要在每个相关分区内读取数据。观察访问类型、选中的索引、估算行数和过滤比例,并核对排序、回表及覆盖情况。若查询以租户和状态作等值过滤,再按创建时间排序,单列时间索引未必能有效减少候选行;复合索引应根据等值条件、范围条件、排序需求和列选择性设计。列顺序不能脱离真实查询模式机械套用。
估算行数是优化器的预测,不等于实际读取行数。执行时间偏高而估算行数很小,可能需要检查实际执行计划、统计信息及计划中的循环;扫描很多行但结果很少,则提示过滤条件与访问路径不匹配。某些执行计划功能会实际执行查询,应在适宜环境中谨慎使用。📏
验收时确认:计划命中预期的分区集合;所选索引与过滤、排序条件相符;实际扫描规模能解释返回数据量;代表性参数下延迟和资源消耗达到既定目标。保存调整前后的计划与测量条件,便于回归时识别变化。若裁剪和索引都合理但延迟仍高,再检查回表成本、排序、并发和存储读写等环节。最终结论应由可重复的计划与测量支持,而不是只凭“已经分区”或“已经加索引”判断。📈