在排查所有查詢陳述句效率的程序中 , 發現了join關聯表的時候 , 被驅動表沒有走索引而是進行的全表掃描
實際的sql陳述句如下:
explain select a.* from audit_rules a left join audit_rules_detail b on a.id=b.rule_id where a.ent_id=23684
輸出:
+----+-------------+-------+------+---------------+------------+---------+-------+------+-------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+------+---------------+------------+---------+-------+------+-------+ | 1 | SIMPLE | a | ref | idx_ent_id | idx_ent_id | 4 | const | 12 | | | 1 | SIMPLE | b | ALL | NULL | NULL | NULL | NULL | 35 | | +----+-------------+-------+------+---------------+------------+---------+-------+------+-------+
看到表b是全表掃描 , 這是因為b的欄位rule_id沒有索引
增加上索引以后
+----+-------------+-------+------+---------------+-------------+---------+--------------+------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+------+---------------+-------------+---------+--------------+------+-------------+ | 1 | SIMPLE | a | ref | idx_ent_id | idx_ent_id | 4 | const | 12 | | | 1 | SIMPLE | b | ref | idx_rule_id | idx_rule_id | 4 | sinanet.a.id | 1 | Using index |
MySQL是只支持一種JOIN演算法Nested-Loop Join(嵌套回圈鏈接)
當關聯欄位有索引時,走的是Index Nested-Loop Join(索引嵌套鏈接)
沒有索引時會走,Block Nested-Loop Join比Simple Nested-Loop Join多了一個中間join buffer緩沖處理的程序
沒有索引時:

有索引時

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/224977.html
標籤:MySQL
