leftjoin和循环查询哪个快_MySQL使⽤join的正确姿势
使⽤join的正确姿势:
1. 使⽤ join 语句,性能⽐强⾏拆成多个单表执⾏ SQL 语句的性能要好;
2. 如果使⽤ join 语句的话,需要让⼩表做驱动表。
“ 如果不能使⽤被驱动表的索引的话,查询效率很低,慎⽤。⽐如两张表t1和t2各100⾏。如果不使⽤索引,MySQL需要扫描100*100共10000⾏;⽽使⽤索引的情况下,t1全表扫描100⾏;t2扫描100次,每次扫描1⾏,共扫描200⾏。
什么是驱动表
MySQL先从哪个表检索,这个表就是驱动表
join语句涉及MySQL中的三种算法
join和in哪个查询更快分别是NLJ(Nested-Loop Join)、Simple Nested-Loop Join、Block Nested-Loop Join(BNL)。
NLJ: 在能够使⽤被驱动表索引的情况下,MySQL会选择NLJ算法。
BNL:当⽆法使⽤驱动表的索引,MySQL会把表⼀次性或分段加载到join buffer中,然后再与被驱动表
中的数据匹配。这就是BNL算法。
Simple Nested-Loop Join: 他的执⾏逻辑与BNL很相似,但是Simple Nested-Loop Join不会把表数据加载到join buffer中,⽽是buffer pool中,这会间接对MySQL性能产⽣很⼤的影响。
Example
有两个表t1和t2,
CREATE TABLE `t2` (
`id` int(11) NOT NULL,
`a` int(11) DEFAULT NULL,
`b` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `a` (`a`)
) ENGINE=InnoDB;
下⾯的join语句的⼀般执⾏流程是:
select * from t1 straight_join t2 on (t1.a=t2.a);
(NLJ)
1. 从表 t1 中读⼊⼀⾏数据 R;
2. 从数据⾏ R 中,取出 a 字段到表 t2 ⾥去查;
3. 取出表 t2 中满⾜条件的⾏,跟 R 组成⼀⾏,作为结果集的⼀部分;
4. 重复执⾏步骤 1 到 3,直到表 t1 的末尾循环结束。
select * from t1 straight_join t2 on (t1.a=t2.b);
(BLJ)
1. 把表 t1 的数据读⼊线程内存 join_buffer 中,由于我们这个语句中写的是 select *,因此是把整个表 t1 放⼊了内存;
2. 扫描表 t2,把表 t2 中的每⼀⾏取出来,跟 join_buffer 中的数据做对⽐,满⾜ join 条件的,作为结果集的⼀部分返回。即将发布的⽂章
join
⼤公司为什么不建议使⽤join

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。