mysql 从left join 到join到查询计划到联合索引的原理

left join

left join在无脑使用中,会大表驱动小表,触发笛卡尔集,效率慢

join会自动小表驱动大表

参考:

从一个MySQL left join优化的例子加深对查询计划的理解 
http://luxuryzh.iteye.com/blog/1976004

相关的explain查询计划解释

type分为system/const/eq_ref/ref/range/index/ALL等好几类,连接的效率从前往后 
好。。》 差

all:木有用到索引

index,用到

range,索引的between in等范围类

ref 非主键索引

const 主键索引

参考:

MySQL执行计划解读 - ggjucheng - 博客园
http://www.cnblogs.com/ggjucheng/archive/2012/11/11/2765237.html

联合索引原理

假设 a为1,2,3,b也为1,2,3

把a,b设为联合索引

则在树中排序方式为(a,b)->

1 1, 1 2, 1 3,

2 1, 2 2 ,2 3,

3 1, 3 2 ,3 3

只看a, a是有序的,而b不是

所以在查询中,如果两者在where中都用到了,则不分先后,mysql都会自动用索引,

如果where中只用了a,也是可以的,因为a有顺序

如果只用到了b,则查询计划中type为all,即无索引使用。

参考:

MySQL InnoDB联合索引学习 – 运维那点事
http://www.ywnds.com/?p=11204

原文地址:https://www.cnblogs.com/stevenlii/p/8609900.html

时间: 2024-10-09 14:10:19

mysql 从left join 到join到查询计划到联合索引的原理的相关文章

Mysql中的联合索引、前缀索引、覆盖索引

索引 索引是一种特殊的文件,它们包含着对数据表里所有记录的引用指针.更通俗的说,数据库索引好比是一本书前面的目录,能加快数据库的查询速度. 联合索引 又名复合索引,由两个或多个列的索引.它规定了mysql从左到右地使用索引字段,对字段的顺序有一定要求.一个查询可以只使用索引中的一部分,更准确地说是最左侧部分(最左优先).如索引是key index (a,b,c). 可以支持a | a,b| a,b,c 3种组合进行查找,但不支持 b,c进行查找 .当最左侧字段是常量引用时,索引就十分有效. CR

Mysql 连接(left join, right join, inner join ,full join)

在mysql的数据查询过程中,我们不仅仅会遇到单表查询的情况,特别在软件开发的过程中我们很多情况下是关联其他表查询相关的数据. 在此我们将学习MySQL 的 JOIN 在两个或多个表中查询数据.可以在SELECT, UPDATE 和 DELETE 语句中使用 Mysql 的 JOIN 来联合多表查询. JOIN 按照功能大致分为如下三类: INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录. LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录. R

mysql not in、left join、IS NULL、NOT EXISTS 效率问题记录

mysql not in.left join.IS NULL.NOT EXISTS 效率问题记录,需要的朋友可以参考下. NOT IN.JOIN.IS NULL.NOT EXISTS效率对比 语句一:select count(*) from A where A.a not in (select a from B) 语句二:select count(*) from A left join B on A.a = B.a where B.a is null 语句三:select count(*) fr

表的基本查询语句及使用、连表(inner join、left join)、子查询

一.表的基本查询语句及方法 from. where. group by(分组).having(分组后的筛选).distinct(去重).order by(排序).  limit(限制) 1.单表查询: 先创建表,数据量稍微多点的表 create table emp( id int not null unique auto_increment, # 和设主建同理 forgeing key name varchar(20) not null, sex enum('male','femlae') no

左连接,右连接,内连接,外连接, join, left join, right join ,mysql ,oracle

2016-6-12 22:35:51 工作用了一年多的oracle,最近在学mysql, 仔细想想 各种连接,感觉这些概念还是蛮烦人的! 最近整理了一下,分享一下自己的理解,有些东西是借鉴网上并自己吸收了的. 1.不管是什么连接,oracle和mysql的原理是一模一样的,只是有些写法不一样而已.说到写法,这里提一下, select * from A, B where a.filed1=b.filed2; --这是第1种写法, 内连接,这样写,很方便, oracle和mysql通用 select

MySQL的几种连接 join/inner join/cross join/逗号/left join/right join/natural join

转载请注明出处!! 之前数据表连接操作多使用逗号或者join,对几种连接的概念一直浑浑噩噩,最近研究了一波,把这些连接的区别搞明白了. 连接:A xjoin B(主表 操作 关联表) select过程:from->where->group by->having->order by->limit 在不使用on语法时,join.inner join.逗号.cross join结果相同,都是取2个表的笛卡尔积.逗号与其他操作符优先级不同,所以有可能产生语法错误,尽量减少用逗号 jo

mysql innerjoin left join right join 解析

毕业半年多时间,一直都没有学习好join  之前一直是先从一个表里面取出数据然后,然后再从另外一个表里面取出数据,然后再写一个函数循环格式化数据. 还是先写一下学到的东西吧! 转载自w3school Join 和 Key 有时为了得到完整的结果,我们需要从两个或更多的表中获取结果.我们就需要执行 join. 数据库中的表可通过键将彼此联系起来.主键(Primary Key)是一个列,在这个列中的每一行的值都是唯一的.在表中,每个主键的值都是唯一的.这样做的目的是在不重复每个表中的所有数据的情况下

springboot中使用JOIN实现关联表查询

* 首先要确保你的表和想要关联的表有外键连接 repository中添加接口JpaSpecificationExecutor<?>,就可以使用springboot jpa 提供的API了. @Repository public interface MyEntityRepository extends JpaRepository<MyEntity, Integer>, JpaSpecificationExecutor<MyEntity> { //... } 在查询方法中调

SQL-连接查询:left join,right join,inner join,full join之间的区别

参考: https://www.cnblogs.com/lijingran/p/9001302.html https://www.cnblogs.com/assasion/p/7768931.html 因为单纯的select * from a,b是笛卡尔乘积.比如a表有5条数据,b表有3条数据,那么最后的结果有5*3=15条数据. 所以需要对两个表进行关联: select * from a,b where a.id = b.id 此时就等价于: select * from a inner joi