EXPLAIN rows 估算STRAIGHT_JOIN 強制連接順序驗證假設SELECT c.yh_id, c.yh_dm, c.yh_mc, c.mm, c.yh_lx,
a.jg_id, a.jg_dm, a.jg_mc, a.jgxz_dm, d.js_dm yh_js
FROM a, b, c
LEFT JOIN d ON d.yh_id = c.yh_id
WHERE a.jg_id = b.jg_id
AND b.yh_id = c.yh_id
AND a.yx_bj = 'Y' AND c.sc_bj = 'N'
AND c.yx_bj = 'Y' AND c.sc_bj = 'N'
AND c.yh_dm = '006939748XX';
耗時 750ms,EXPLAIN 顯示兩大瓶頸:
a 表 type=ALL 掃描 52,616 行d 表 type=index 全索引掃描 54,584 行ALTER TABLE d ADD INDEX ind_yh_id(yh_id);
d 表掃描行數 54,584 → 272,但總耗時 770ms 未改善(驅動表仍是 a)。
ALTER TABLE c ADD INDEX ind_yh_dm(yh_dm);
優化器仍選 a 驅動,因 b 表無 yh_id 索引,關聯代價大。
ALTER TABLE b ADD INDEX ind_yh_id(yh_id);
最終執行計劃:
+----+-------------+-------+------+----------------+-----------+---------+----------+------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+------+----------------+-----------+---------+----------+------+-------------+ | 1 | SIMPLE | c | ref | ind_yh_dm | ind_yh_dm | 57 | const | 2 | Using where | | 1 | SIMPLE | d | ref | ind_yh_id | ind_yh_id | 98 | c.yh_id | 272 | Using index | | 1 | SIMPLE | b | ref | ind_yh_id | ind_yh_id | 98 | c.yh_id | 531 | Using index | | 1 | SIMPLE | a | eq_ref| PRIMARY | PRIMARY | 98 | b.jg_id | 1 | Using where | +----+-------------+-------+------+----------------+-----------+---------+----------+------+-------------+
耗時:0.00 秒(750ms → <1ms)。
STRAIGHT_JOIN 是驗證假設的利器,生產慎用