💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
项目里有个表 使用 EXPLAIN 发现 extra 里是 USING JOIN buffer (Block Nested LOOP), 明明有索引,rows 是查询了表中所有数据, 导致还是特别慢, 几十秒 t 表有数百万数据, 其他两表很少, 几十几百的 原来 t 表的索引字段是 level、rate、operdate, 由于不确定都那些SQL使用这个索引, 所以把 sid 追加到这个这个索引最后了。 执行SQL发现, 走索引, 但还是很慢, rows 是查询了表中所有数据, Using join buffer (Block Nested Loop) 改成加前面(要注意其他使用这个索引的SQL是否有sid, 否则会失效), 这次走索引, 查询很快 主要是t.sid = s.id , t表的sid是s表的关联字段,一开始没加索引,导致两表关联时嵌套循环了, 后边加上了索引, 但是是在多字段联合索引的最后, 也不行,放到最前才可以。 原因是多表关联 先触发sid=id这个, 但是这时候是找不到索引(因为他再联合索引的最后一位)。 不过在放所有最后和最前之前,我还单加过一个sid的单字段索引, 这个时候两个索引SQL都使用了, 依然慢 触发USING JOIN buffer (Block Nested LOOP) ``` EXPLAIN SELECT t.id FROM t, s, u WHERE t.sid = s.id AND u.unitcode = s.unitname AND s.type_name = 'wang' AND t.rate = 2 AND t.level= 2 AND t.operdate >= "2023-06-01" AND t.operdate <= '2023-06-30' ORDER BY t.operdate, s.sid, s.pid ```