标准答案
- 先用高选择性的条件过滤数据,让进入 JOIN 的行数尽可能小,并确保过滤和关联字段有合适索引。
- 驱动表不是固定由书写顺序决定,优化器会重排;但统计信息、连接条件和数据分布会影响其选择。
- 关联键两侧应保持类型一致,避免函数和隐式转换导致索引无法使用。
- 只查询真正需要的列,避免宽行回表、重复行和大结果集通过网络传输。
- 复杂查询可以拆成分阶段查询、预聚合或物化读模型,但拆分后要处理一致性和分页语义。
题目解析
大表 JOIN 变慢常不是 JOIN 语法本身,而是前面已经扫描或展开了过多数据。例如先从低选择性状态扫描百万订单,再关联用户表,即使用户表有索引也会产生巨大的循环访问成本。
不能仅按“少 JOIN”优化。有时用一个正确的 JOIN 加覆盖索引比应用层先查一批 ID 再循环查详情更高效,也更容易保证一致的排序和权限条件。
常见误区
- 把需要 EXISTS 的存在性判断写成一对多 JOIN 后再 DISTINCT,制造大量重复中间行。
- 为避免 JOIN 把所有表数据拉到应用内存里再关联,造成更高的延迟和内存占用。