MySql join匹配原理

时间:2019-04-15
本文章向大家介绍MySql join匹配原理,主要包括MySql join匹配原理使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

疑问

表:sl_sales_bill_head 订单抬头表 数据行:8474

表:sl_sales_bill          订单明细 数据行:8839

字段:SALES_BILL_NO 订单号

情况1

没有任何索引 sql语句

EXPLAIN select * from sl_sales_bill_copy1 lb
 join sl_sales_bill_head_copy1 lh on lh.SALES_BILL_NO = lb.SALES_BILL_NO 

lh为主表 lb为子表

改一下sql语句

EXPLAIN select * from  sl_sales_bill_head_copy1 lh
 join sl_sales_bill_copy1 lb on lh.SALES_BILL_NO = lb.SALES_BILL_NO 

疑问:为什么sql语句无论主表是哪个 lh都先执行

情况2

sl_sales_bill_head_copy1 的SALES_BILL_NO为主键索引

ALTER TABLE `sl_sales_bill_head_copy1` ADD PRIMARY KEY (`SALES_BILL_NO`) ;

sql语句1:

EXPLAIN select * from  sl_sales_bill_head_copy1 lh
 join sl_sales_bill_copy1 lb on lh.SALES_BILL_NO = lb.SALES_BILL_NO 

sql语句2:

EXPLAIN select * from   sl_sales_bill_copy1 lb
 join sl_sales_bill_head_copy1 lh on lh.SALES_BILL_NO = lb.SALES_BILL_NO 

疑问:为什么无论怎么通过sql语句改变主表 始终是lb先执行

情况3 

 EXPLAIN select * from   sl_sales_bill_copy1 lb
 join sl_sales_bill_head_copy1 lh on lh.SALES_BILL_NO = lb.SALES_BILL_NO 
where lb.SALES_BILL_NO='HP20190410000099'  
 EXPLAIN select * from   sl_sales_bill_copy1 lb
 join sl_sales_bill_head_copy1 lh on lh.SALES_BILL_NO = lb.SALES_BILL_NO 
where lh.SALES_BILL_NO='HP20190410000099'  

都会正常走索引 同时也是lh先执行

如果改为lb的其他字段

EXPLAIN select * from   sl_sales_bill_copy1 lb
 join sl_sales_bill_head_copy1 lh on lh.SALES_BILL_NO = lb.SALES_BILL_NO 
where lb.id='0001c3fd44454a65a4122b259283f979'  

无索引情况

ID有索引情况

变成了lb先执行