SELECT
一堆明细数据
FROM
明细表
LEFT JOIN 单据表
LEFT JOIN 项目表
LEFT JOIN 明细关联组织的id表
LEFT JOIN 公司组织结构表
WHERE
明细.`status` = 0 -- 明细状态为正常
and 单据.`status` = 0; -- 单据状态为正常
以上语句执行时间大概是1分钟,如果加上了部门ID != "某部门ID"
的条件之后,查询时间直接翻了10倍以上,这是为什么啊?
“Devil组”引证GPT后的撰写:
添加不等于条件可能会导致查询优化器无法使用合适的索引,从而导致查询性能的下降。在这个问题中,如果添加了部门ID的条件,而该条件又没有被索引覆盖,查询优化器可能会选择全表扫描,导致查询时间大幅度增加。
要解决这个问题,可以尝试优化查询语句,使得查询条件能够被索引覆盖,或者在查询之前确保表的索引信息是最新的。例如,可以尝试在查询条件中使用等于操作符而不是不等于操作符,或者使用覆盖索引等技术来避免全表扫描。另外,可以考虑优化查询语句的性能,如分析查询语句的执行计划、增加索引等等。望采纳
1、最后一行(11行)的and条件,导致你第 5 行的LEFT JOIN 单据表 直接变成了 JOIN 单据表……
2、想来 部门ID 字段应该属于 公司组织结构表,且这个表中的数据量最小,当你在LEFT JOIN 连接中,在最后的WHERE中使用该表的 部门ID 作为条件时,你的 LEFT JOIN 本身很有可能直接变为 INNER JOIN 了…………最终结果可能与你预期的不符合
3、当你在WHERE中加了 部门ID != "某部门ID" 的条件之后,你FROM中的5张表关联的所有数据均需要判定这个条件,即便是每张表100的数据量(关联ON的条件筛选之后),需要判定的数据量也有100^5=10亿,而且 != 无法利用索引
4、从整理FROM子句的关联路径上看,你是明细表关联主表,即大表关联小表),而正常的关联路径应该是小表关联大表
5、如果不修改你的关联路径,你需要将你整个语句作为一个子句,在SELECT中添加 部门ID字段,在外部再包一层SELECT语句,其WHERE条件仅 部门ID != "某部门ID" 条件即可
7、如果修改你的关联路径……需要知道你的各表数据量、索引情况以及关联中涉及的结果数据量等等才能决定如何修改…………