sql中left join的效率分析与提高效率方法

网站随着数据量与访问量越来越大,访问的速度变的越来越慢,于是开始想办法解决优化速度慢的原因

下面是对程序中一条sql的分析过程,当然程序的执行效率不单单是sql语句的问题,还有可能是服务器配置,网速,程序语言等各方法的问题,今天我们先来分析一下sql语句中left join的效率问题

sql语句中包含以下信息:

1、sql包含数据处理函数,比如nvl函数,case when函数等

2、sql中包含inner join,left join等关联关系

3、sql中有排序和分页

下面是分析过程

1、首先把排序去掉,速度确实很快,但没办法,排序是必须的,这样做只是为了证明排序确实是很耗资源

2、将nvl,case when等函数去掉,结果速度几乎没有任何改变

3、将inner join的表去除,速度稍微快了几十毫秒

4、将left join的表去掉,速度从原来的4秒提高到1秒内。

综合所得,left join才是速度慢的元凶,于是将left join关联关系字段都加为索引,在测试,发现速度基本能保持在1秒左右。问题解决。

结论:left join是相当耗资源的操作,如果关联的字段没有索引的话,速度是很慢的,所以如果有left join的话,最好用索引字段取关联。或者给关联的字段加索引

网上还看到有人说,将left join右边的表数据补齐,然后将left join 替换为 inner join。我试过,速度确实快很多,但考虑到数据量的问题,未测试此方法。

(0)

相关推荐

  • SQL之left join、right join、inner join的区别浅析

    今天和某朋友聊天,谈到他们公司的一个小问题.如下: 表A设备表,存储MAC地址,省份,城市,区. 表B软件表,存储MAC地址,软件名字. 功能是可以按省份,城市,或者区来查询软件列表. 你猜它现在如何做的? 它通过省份,城市,或者区取得MAC地址,然后查询B表用in查询. 这个很明显是不合理的,处理这种多对多的关系,为什么不用多表联查呢? 链表的方法常用的有3个: (inner) join 内部等值连接.left join 左连接 和 right join右连接. 有什么区别呢?怎么用呢? 下面

  • sql left join 命令详解

    给个通俗的解释吧. 例表a aid adate 1 a1 2 a2 3 a3 表b bid bdate 1 b1 2 b2 4 b4 两个表a,b相连接,要取出id相同的字段 select * from a inner join b on a.aid = b.bid这是仅取出匹配的数据. 此时的取出的是: 1 a1 b1 2 a2 b2 那么left join 指: select * from a left join b on a.aid = b.bid 首先取出a表中所有数据,然后再加上与a,

  • sql 左连接和右连接的使用技巧(left join and right join)

    下面给一个例子进行说明: 例表a aid adate 1 a1 2 a2 3 a3 表b bid bdate 1 b1 2 b2 4 b4 left join: select * from a left join b on a.aid = b.bid 首先取出a表中所有数据,然后再加上与a,b匹配的的数据 此时的取出的是: 1 a1 b1 2 a2 b2 3 a3 空字符 同样的也有right join 指的是首先取出b表中所有数据,然后再加上与a,b匹配的的数据 此时的取出的是: 1 a1 b

  • 超详细mysql left join,right join,inner join用法分析

    下面是例子分析表A记录如下: aID        aNum 1           a20050111 2           a20050112 3           a20050113 4           a20050114 5           a20050115 表B记录如下: bID        bName 1            2006032401 2           2006032402 3           2006032403 4           20

  • SQL 外链接操作小结 inner join left join right join

    数据库操作语句  7. 外连接--交叉查询 7.1 查询  7.2 等值连接 7.3 右外连接 7.4 左外连接 7.5 更新操作 简介: 外部连接和自联接 inner join(等值连接) 只返回两个表中联结字段相等的行 left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录 on 指定表间联结字段及其关系的等号 "=" 表达式, 返回 true 或 false. 当表达式返

  • 解析sql语句中left_join、inner_join中的on与where的区别

    table a(id, type):id     type ----------------------------------1      1         2      1          3      2          table b(id, class):id    class ---------------------------------1      12      2sql语句1:select a.*, b.* from a left join b on a.id = b

  • 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(*) from A where not exists (select a from B where A.a = B.a) 知道以上三

  • SQL中的left join right join

    以下是它们的共同点: 1. 关于左右表的概念.左表指的是在SQL语句中排在left join左边的表,右表指的是排在left join右边的表. 2. 在拼成的大表中,左表排在左边,右表排在右边. 3. on条件语句最好用=号对两表相应的主外键进行连接.当然,也可以用其他操作符,如>, <, 来连接两表的任一字段,此时的关系将非常复杂,连接后的记录数也随之而变得不确定.如果在一些特殊的场合中需要用到这种方式,必须通过简单的实例加以确认,否则,连接结果很可能不是我们所想要的! 4. on条件语句

  • MySQL利用profile分析慢sql详解(group left join效率高于子查询)

    使用profile来分析慢sql mysql 的 sql 性能分析器主要用途是显示 sql 执行的整个过程中各项资源的使用情况.分析器可以更好的展示出不良 SQL 的性能问题所在. 最近遇到一个查询比较慢的sql语句,用了子查询,大概需要0.8秒左右,这个消耗时间比较长,严重影响了性能,所以需要进行优化.单独查询单表或者子查询记录都很快,下面来看看详细的介绍. 开启profile mysql> show profiles; -- 查看是否开启 Empty set, 1 warning (0.00

  • sql中left join的效率分析与提高效率方法

    网站随着数据量与访问量越来越大,访问的速度变的越来越慢,于是开始想办法解决优化速度慢的原因 下面是对程序中一条sql的分析过程,当然程序的执行效率不单单是sql语句的问题,还有可能是服务器配置,网速,程序语言等各方法的问题,今天我们先来分析一下sql语句中left join的效率问题 sql语句中包含以下信息: 1.sql包含数据处理函数,比如nvl函数,case when函数等 2.sql中包含inner join,left join等关联关系 3.sql中有排序和分页 下面是分析过程 1.首

  • Java中多线程下载图片并压缩能提高效率吗

    目录 前言 实现思路 实测 前言 需求 导出Excel:本身以为是一个简单得导出,但是每行得记录文件中有一列为图片url,需要下载所有记录行对应得图片,然后压缩整个文件夹. 这里只做4.5.得代码讲解描述,其它也没什么好说得,话不多说上代码. 实现思路 多线程实现使用了线程池,Jdk1.8并发包下的CompletableFuture 第一步:得到基础数值 // 线程数 Integer threadNum = 10; // 每条线程需要处理的图片数 int dataNum = imageInfoV

  • C#多线程之Thread中Thread.Join()函数用法分析

    本文实例讲述了C#多线程之Thread中Thread.Join()函数用法.分享给大家供大家参考.具体分析如下: Thread.Join()在MSDN中的解释:Blocks the calling thread until a thread terminates 当NewThread调用Join方法的时候,MainThread就被停止执行, 直到NewThread线程执行完毕. Thread oThread = new Thread(new ThreadStart(oAlpha.Beta));

  • 听说mysql中的join很慢?是你用的姿势不对吧

    目录 驱动表与被驱动表 驱动表和被驱动表有什么差异 基于索引的join join查询中如何选择驱动表 不使用join,执行效率是否会更高 join 是进行两个或多个数据表进行关联查询的过程中,经常使用的一种查询手段.提到join,你一定会想到"笛卡尔积",当数据量很大的时候,"笛卡尔积"运算量会成倍的增加,在我们的印象中,join是一种运算效率不高的查询语句. 除了定性的判断join慢之外,你能定量的判断join的执行效率吗? 经过下面对join执行效率定量分析后,

  • MySQL中Stmt 预处理提高效率问题的小研究

    复制代码 代码如下: DELIMITER $$ set @stmt = 'select userid,username from myuser where userid between ? and ?'; prepare s1 from @stmt; set @s1 = 2; set @s2 = 100; execute s1 using @s1,@s2; deallocate prepare s1; $$ DELIMITER ; 用这种形式写的查询,可以随意替换参数,给出代码的人称之为预处理,

  • SQL中字符串中包含字符的判断方法

    在sql中我判断包含字符串我们可使用很多方法,如like,replace,charindex函数都可实现我们要的功能,下面我来给各位介绍判断字符串包含字符串sql语句. 通过2个函数CHARINDEX和PATINDEX以及通配符的灵活使用 函数:CHARINDEX和PATINDEX CHARINDEX:查某字符(串)是否包含在其他字符串中,返回字符串中指定表达式的起始位置. PATINDEX:查某字符(串)是否包含在其他字符串中,返回指定表达式中某模式第一次出现的起始位置:如果在全部有效的文本和

  • sql中的left join及on、where条件关键字的区别详解

    LEFT JOIN 关键字会从左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中没有匹配的行. LEFT JOIN 关键字语法 SELECT column_name(s) FROM table_name1 LEFT JOIN table_name2 ON table_name1.column_name=table_name2.column_name 注释:在某些数据库中, LEFT JOIN 称为 LEFT OUTER JOIN. 创建两张表并插入一些

  • mysql中left join设置条件在on与where时的用法区别分析

    本文实例讲述了mysql中left join设置条件在on与where时的用法区别.分享给大家供大家参考,具体如下: 一.首先我们准备两张表来进行测试. CREATE TABLE `a` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', `name` varchar(32) DEFAULT '' COMMENT '名称', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET

  • Node.js中path.join()优势例举分析

    您可能想知道为什么要使用 path.join() 方法而不是字符串拼接. '/path' + '/' + 'to' + '/' + 'test.txt' // '/path/to/test.txt' ['/path', 'to', 'test.txt'].join('/') // '/path/to/test.txt' 1.对于Windows支持.Windows 使用反斜杠(\)而不是正斜杠(/)作为路径分隔符. path.join() 会为我们处理此问题.因为 path.join('data'

  • SQL语句中LEFT JOIN的ON和WHERE有什么区别

    目录 阐述 left join的on和where的条件区别 第一条SQL的过程 第二条SQL的过程 阐述 写SQL时本想通过 A left B join on and 后面的条件查出的两条记录变成一条,奈何发现还是有两条. 后来发现 join on and 不会过滤结果记录条数,只会根据 and 后的条件是否显示 B 表的记录,A 表的记录一定会显示. 不管 and 后面的是 A.id=1 还是 B.id=1,都显示出 A 表中所有的记录,并关联显示 B 中对应 A 表中 id 为 1 的记录或

随机推荐