疑问

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

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

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

字段: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 

MySql join匹配原理 随笔 第1张

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 

MySql join匹配原理 随笔 第2张

疑问:为什么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 

MySql join匹配原理 随笔 第3张

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 

MySql join匹配原理 随笔 第4张

疑问:为什么无论怎么通过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'  

MySql join匹配原理 随笔 第5张

都会正常走索引 同时也是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'  

无索引情况

MySql join匹配原理 随笔 第6张

ID有索引情况

MySql join匹配原理 随笔 第7张

变成了lb先执行

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄