MySql Join 语法 性能 优化

联结的语法:

 ... from table1 inner|left|right join table2 on condition

内外联结的区别: 内联结将去除所有不符合条件condition的记录,外联结将保留部分不符合condition的记录;

               左联结将保留左边表table1的记录,此时右边表table2只返回符合condition的记录。

1,join概述

 ... from table1 inner|left|right join table2 on condition

inner join : 内联结,等值联结,取得两个表中符合condition的记录id。

left join : 左联结,取得table1的所有记录(table1中condition中的字段可能为空),和table2符合condition的记录,

right join : 右联结,取得table2的所有的记录(table2中condition中的字段可能为空),和table1符合condition的记录,

2,Inner join

内联结

  select * from A inner join B on A.mobile = B.mobile and andCondition;

将会返回 A.id 不为空,B.id 不为空,且A.mobile = B.mobile 和符合 andCondition的数据

3,left join

select * from A left join B on A.mobile = B.mobile and andCondition;

将会返回A的所有记录和 B.mobile = A.mobile的所有B的记录。

如果想取得A表中不满足condition的数据

select * from A

left join B on A.mobile = B.mobile

where B.is is null

得到

用left join 模拟 inner join

  -> select * from A left join B on A.mobile = B.mobile where B.id is not null;

求A B 表中不符合condition条件的各自数据的集合

   -> select * from A left join B on A.mobile = B.mobile where B.id is null

    union

    select * from A right join B on A.mobile = B.mobile where A.id is null

得到差异数据(不符合condition的两个表的数据)

  

4,right join

-> select * from A right B on A.mobile = B.mobile ;

将得到B表的所有数据和A表中满足condition的数据

5,cross join

交叉联结,得到的是两个表的乘积

在mysql中(仅限mysql) cross join 和 inner join 的表现是一样的。在不指定on条件得到的都是笛卡尔积。

所以下面的三个语句效果一样

->...from A inner join B

->...from A cross join B

->...from A join B

6,full join

->  select * from A left join B on A.mobile = B.mobile;

  union

  select * from A right join B on A.mobile = B.mobile;

得到

7,性能优化

(1)显示inner join 和 隐式inner join

显示 --> select * from A inner join B on A.mobile = B.mobile;

隐式 --> select * from A inner join B where A.mobile = B.mobile;

10万数据的查询用时几乎相等。

(2)left join / right join 和 inner join

尽量用inner join 避免 外联结 和 null

在使用外联结的时候,如 -> select * from A left join B on A.mobile = B.mobile where whereCondition;

如果B中没有满足on condition的条件,则会产生一行所有列为null的数据。

  在 on condition 匹配阶段,where 条件不会被使用。在on condition结束后,where将会被使用,where条件将会从满足on condition的数据中再检索一次。

所以,在使用外联结市,我们要尽量给出尽可能多的匹配满足条件(即 on condition),减少where字句的检索。

不建议sql -> select * from A

          left join B on A.mobile = B.mobile

          left join C on A.name = C.name

          where A.status = 1 and C.status = 1

建议的sql -> select * from A

          left join B on A.mobile = B.mobile and A.status = 1

          left join C on A.name = C.name and C.status = 1

尽量满足on condition,而少使用where的条件。

(3)on 条件 和 where 条件的不同

->select * from A left join B on A.mobile = B.mobile on A.name is not null;

将会返回A表的所有记录 和 B表中满足 (A.mobile = B.mobile on A.name is not null) 的记录;

->select * from A left join B on A.mobile = B.mobile where A.name is not null;

将会返回A表中所有记录 和 B表中满足 (A.mobile = B.mobile)的记录,然后 再通过where条件(A.name is not null)对结果进行筛选。

第一条sql语句返回的结果集条数 >= 第二条sql

(4)尽量避免子查询,而用join

时间: 2024-08-26 07:03:25

MySql Join 语法 性能 优化的相关文章

Mysql Join语法解析与性能分析详解

一.Join语法概述 join 用于多表中字段之间的联系,语法如下: ... FROM table1 INNER|LEFT|RIGHT JOIN table2 ON conditiona table1:左表:table2:右表. JOIN 按照功能大致分为如下三类: INNER JOIN(内连接,或等值连接):取得两个表中存在连接匹配关系的记录. LEFT JOIN(左连接):取得左表(table1)完全记录,即是右表(table2)并无对应匹配记录. RIGHT JOIN(右连接):与 LEF

Mysql Join语法以及性能优化

引言 内外联结的区别是内联结将去除所有不符合条件的记录,而外联结则保留其中部分.外左联结与外右联结的区别在于如果用A左联结B则A中所有记录都会保留在结果中,此时B中只有符合联结条件的记录,而右联结相反,这样也就不会混淆了. 一.Join语法概述 join 用于多表中字段之间的联系,语法如下: 代码如下: FROM table1 INNER|LEFT|RIGHT JOIN table2 ON conditiona table1:左表:table2:右表. JOIN 按照功能大致分为如下三类: IN

Mysql Join语法解析与性能分析

一.Join语法概述 join 用于多表中字段之间的联系,语法如下: ... FROM table1 INNER|LEFT|RIGHT JOIN table2 ON conditiona table1:左表:table2:右表. JOIN 按照功能大致分为如下三类: INNER JOIN(内连接,或等值连接):取得两个表中存在连接匹配关系的记录. LEFT JOIN(左连接):取得左表(table1)完全记录,即使右表(table2)并无对应匹配记录. RIGHT JOIN(右连接):与 LEF

MySQL设计规范与性能优化

引言 MySQL是目前使用最为广泛的关系型数据库之一,如果使用得当,可支撑企业级高并发.高可靠服务,使用不当甚至连并发量略高的个人网站都难以支撑: 就算使用了缓存,大量的数据库访问依旧在所难免,即使设置了较长的缓存有效期,而且缓存命中率较理想,但缓存的创建和过期后的重建都是需要访问数据库的: 本文主要从MySQL表结构设计规范和MySQL自身性能优化两方面来讨论该如何对MySQL数据库进行优化: MySQL表结构设计规范 1. 数据库设计命名规范 (1)数据库,数据表一律使用前缀,前缀名称一般不

MySQL之查询性能优化四

MySQL的万能"嵌套循环"并不是对每种查询都是最优的.不过还好,mysql查询优化器只对少部分查询不适用,而且我们往往可以通过改写查询让mysql高效的完成工作.在这我们先来看看mysql优化器有哪些局限性: 1.关联子查询 mysql的子查询实现得非常糟糕.最糟糕得一类查询是where条件中包含in()的子查询语句. 例如,我们希望找到sakila数据库中,演员Penlope Guiness参演的所有影片信息. 很自然的,我们会按照下面的方式用子查询实现: select * fro

mysql配置以及性能优化(转)

MySQL配置文件my.cnf中文详解,附mysql性能优化方法分享 ================================================================================================= Mysql参数优化对于新手来讲,是比较难懂的东西,其实这个参数优化,是个很复杂的东西,对于不同的网站,及其在线量,访问量,帖子数量,网络情况,以及机器硬件配置都有关系,优化不可能一次性完成,需要不断的观察以及调试,才有可能得到最佳效果

mysql配置以及性能优化

MySQL配置文件my.cnf中文详解,附mysql性能优化方法分享 ================================================================================================= Mysql参数优化对于新手来讲,是比较难懂的东西,其实这个参数优化,是个很复杂的东西,对于不同的网站,及其在线量,访问量,帖子数量,网络情况,以及机器硬件配置都有关系,优化不可能一次性完成,需要不断的观察以及调试,才有可能得到最佳效果

MySQL JOIN 语法说明与 图解

一.MySQL JOIN 分类 JOIN 按照功能大致分为如下三类: INNER JOIN(内连接):取得两个表中存在连接匹配关系的记录. LEFT JOIN(左连接):取得左表(table1)完全记录,即是右表(table2)并无对应匹配记录. RIGHT JOIN(右连接):与 LEFT JOIN 相反,取得右表(table2)完全记录,即是左表(table1)并无匹配对应记录. 二.图解关系 INNER JOIN:用于取得两个表中存在连接匹配关系的记录. mysql> select * f

IN、EXISTS的相关子查询用INNER JOIN 代替--性能优化

如果保证子查询没有重复 ,IN.EXISTS的相关子查询可以用INNER JOIN 代替.比如: IN.EXISTS的相关子查询用INNER JOIN 代替--sql2000性能优化