听说mysql中的join很慢?是你用的姿势不对吧
目录 驱动表与被驱动表 驱动表和被驱动表有什么差异 基于索引的join join查询中如何选择驱动表 不使用join,执行效率是否会更高 join 是进行两个或多个数据表进行关联查询的过程中,
目录驱动表与被驱动表驱动表和被驱动表有什么差异基于索引的joinjoin查询中如何选择驱动表不使用join,执行效率是否会更高
join 是进行两个或多个数据表进行关联查询的过程中,经常使用的一种查询手段。提到join,你一定会想到"笛卡尔积",当数据量很大的时候,"笛卡尔积"运算量会成倍的增加,在我们的印象中,join是一种运算效率不高的查询语句。
除了定性的判断join慢之外,你能定量的判断join的执行效率吗?
经过下面对join执行效率定量分析后,可能你会改变对join的认识,不在想当然的认为join就一定很慢了。
驱动表与被驱动表
进行join操作的两个表,分别称为驱动表和被驱动表,到底哪个是驱动表,哪个是被驱动表是不确定的,这个是mysql优化器来决定,和sql语句中两个表的位置没有关系。
如果我们想要强制指定两个表的对应关系,可以将sql中的join替换成 straight_join,替换后,在straight_join前的表称为驱动表,在straight_join后的表,称为被驱动表。
驱动表和被驱动表有什么差异
在join语句执行的过程中,驱动表和被驱动表所执行的操作是不同的。同是驱动表或被驱动表,在不同的join类型中,所执行操作也是不同的。
下面我们分析一下,不同join类型下,驱动表和被驱动表所做的操作的具体内容。
为了方便下面问题的讨论,我们建立如下的表结构:
create table 'table1' ( 'id' int(11) NOT NULL, 'a' int(11) DEFAULT NULL, 'b' int(11) DEFAULT NULL, PRIMARY KEY ('id'), KEY 'a' ('a') ) engine = Innodb;
insert into table1 values(1,1,1) insert into table1 values(2,2,2) ... insert into table1 values(1000,1000,1000) // 也可以使用存储过程来实现大批量数据的插入
create table table2 like table1; insert into t2 (select * from t2 where id <= 100)
建立表结构完全相同的两个表table1和table2,共有三个字段:id为主键字段,索引字段a和普通字段b。向table1中插入了1000行自增的数据,将table1中的前100行数据插入到table2中。