2020-11-20

[MySQL] mysql优化实例-为join表关联字段增加索引

在排查所有查询语句效率的过程中 , 发现了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缓冲处理的过程

没有索引时:

 

 

有索引时

 









原文转载:http://www.shaoqun.com/a/490692.html

巴克莱:https://www.ikjzd.com/w/2775

四海商舟:https://www.ikjzd.com/w/1516

自贸区跨境通网站:https://www.ikjzd.com/w/1329


在排查所有查询语句效率的过程中,发现了join关联表的时候,被驱动表没有走索引而是进行的全表扫描实际的sql语句如下:explainselecta.*fromaudit_rulesaleftjoinaudit_rules_detailbona.id=b.rule_idwherea.ent_id=23684输出:+----+-------------+-------+------+---------
首信易支付:首信易支付
parser:parser
锣鼓咚咚锵,大戏天天演!第三届乡村艺术嘉年华12月7日开幕:锣鼓咚咚锵,大戏天天演!第三届乡村艺术嘉年华12月7日开幕
疫情天下事(2月3日):足不出户尽掌跨境电商要闻!:疫情天下事(2月3日):足不出户尽掌跨境电商要闻!
峨眉山著名特产——干笋 - :峨眉山著名特产——干笋 -

No comments:

Post a Comment