精华内容
下载资源
问答
  • 2021-02-08 05:59:32

    SQL优化

    1.执行路径:ORACLE的这个功能大大地提高了SQL的执行性能并节省了内存的使用:我们发现,单表数据的统计比多表统计的速度完全是两个概念.单表统计可能只要0.02秒,但是2张表联合统计就

    可能要几十秒了.这是因为ORACLE只对简单的表提供高速缓冲(cache buffering) ,这个功能并不适用于多表连接查询..数据库管理员必须在init.ora中为这个区域设置合适的参数,当这个内存

    区域越大,就可以保留更多的语句,当然被共享的可能性也就越大了.

    2.选择最有效率的表名顺序(记录少的放在后面)

    ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,因此FROM子句中写在最后的表(基础表 driving table)将被最先处理. 在FROM子句中包含多个表的情况下,你必须选择记录条数最

    少的表作为基础表.当ORACLE处理多个表时, 会运用排序及合并的方式连接它们.首先,扫描第一个表(FROM子句中最后的那个表)并对记录进行派序,然后扫描第二个表(FROM子句中最后第二个表

    ),最后将所有从第二个表中检索出的记录与第一个表中合适记录进行合并.

    例如: 表 TAB1 16,384 条记录

    表 TAB2 1       条记录

    选择TAB2作为基础表 (最好的方法)

    select count(*) from tab1,tab2    执行时间0.96秒

    选择TAB2作为基础表 (不佳的方法)

    select count(*) from tab2,tab1    执行时间26.09秒

    如果有3个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表, 交叉表是指那个被其他表所引用的表.

    例如:    EMP表描述了LOCATION表和CATEGORY表的交集.

    SELECT *

    FROM LOCATION L ,

    CATEGORY C,

    EMP E

    WHERE E.EMP_NO BETWEEN 1000 AND 2000

    AND E.CAT_NO = C.CAT_NO

    AND E.LOCN = L.LOCN

    将比下列SQL更有效率

    SELECT *

    FROM EMP E ,

    LOCATION L ,

    CATEGORY C

    WHERE   E.CAT_NO = C.CAT_NO

    AND E.LOCN = L.LOCN

    AND E.EMP_NO BETWEEN 1000 AND 2000

    3.WHERE子句中的连接顺序(条件细的放在后面)

    ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾.

    例如:

    (低效,执行时间156.3秒)

    SELECT …

    FROM EMP E

    WHERE   SAL > 50000

    AND     JOB = ‘MANAGER’

    AND     25 < (SELECT COUNT(*) FROM EMP

    WHERE MGR=E.EMPNO);

    (高效,执行时间10.6秒)

    SELECT …

    FROM EMP E

    WHERE 25 < (SELECT COUNT(*) FROM EMP

    WHERE MGR=E.EMPNO)

    AND     SAL > 50000

    AND     JOB = ‘MANAGER’;

    4.SELECT子句中避免使用'* '

    当你想在SELECT子句中列出所有的COLUMN时,使用动态SQL列引用 '*' 是一个方便的方法.不幸的是,这是一个非常低效的方法. 实际上,ORACLE在解析的过程中, 会将'*' 依次转换成所有的列

    名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间.

    5.减少访问数据库的次数

    当执行每条SQL语句时, ORACLE在内部执行了许多工作: 解析SQL语句, 估算索引的利用率, 绑定变量 , 读数据块等等. 由此可见, 减少访问数据库的次数 , 就能实际上减少ORACLE的工作量.

    方法1 (低效)

    SELECT EMP_NAME , SALARY , GRADE

    FROM EMP

    WHERE EMP_NO = 342;

    SELECT EMP_NAME , SALARY , GRADE

    FROM EMP

    WHERE EMP_NO = 291;

    方法2 (高效)

    SELECT A.EMP_NAME , A.SALARY , A.GRADE,

    B.EMP_NAME , B.SALARY , B.GRADE

    FROM EMP A,EMP B

    WHERE A.EMP_NO = 342

    AND    B.EMP_NO = 291;

    6.删除重复记录

    最高效的删除重复记录方法 ( 因为使用了ROWID)

    DELETE FROM EMP E

    WHERE E.ROWID > (SELECT MIN(X.ROWID)

    FROM EMP X

    WHERE X.EMP_NO = E.EMP_NO);

    7.用TRUNCATE替代DELETE

    当删除表中的记录时,在通常情况下, 回滚段(rollback segments ) 用来存放可以被恢复的信息. 如果你没有COMMIT事务,ORACLE会将数据恢复到删除之前的状态(准确地说是恢复到执行删除

    命令之前的状况)

    而当运用TRUNCATE时, 回滚段不再存放任何可被恢复的信息.当命令运行后,数据不能被恢复.因此很少的资源被调用,执行时间也会很短.

    8.尽量多使用COMMIT

    只要有可能,在程序中尽量多使用COMMIT, 这样程序的性能得到提高,需求也会因为COMMIT所释放的资源而减少:

    COMMIT所释放的资源:

    a.        回滚段上用于恢复数据的信息.

    b.        被程序语句获得的锁

    c.        redo log buffer 中的空间

    d.       ORACLE为管理上述3种资源中的内部花费

    (在使用COMMIT时必须要注意到事务的完整性,现实中效率和事务完整性往往是鱼和熊掌不可得兼)

    9.减少对表的查询

    在含有子查询的SQL语句中,要特别注意减少对表的查询.

    例如:

    低效

    SELECT TAB_NAME

    FROM TABLES

    WHERE TAB_NAME = ( SELECT TAB_NAME

    FROM TAB_COLUMNS

    WHERE VERSION = 604)

    AND DB_VER= ( SELECT DB_VER

    FROM TAB_COLUMNS

    WHERE VERSION = 604)

    高效

    SELECT TAB_NAME

    FROM TABLES

    WHERE   (TAB_NAME,DB_VER)

    = ( SELECT TAB_NAME,DB_VER)

    FROM TAB_COLUMNS

    WHERE VERSION = 604)

    Update 多个Column 例子:

    低效:

    UPDATE EMP

    SET EMP_CAT = (SELECT MAX(CATEGORY) FROM EMP_CATEGORIES),

    SAL_RANGE = (SELECT MAX(SAL_RANGE) FROM EMP_CATEGORIES)

    WHERE EMP_DEPT = 0020;

    高效:

    UPDATE EMP

    SET (EMP_CAT, SAL_RANGE)

    = (SELECT MAX(CATEGORY) , MAX(SAL_RANGE)

    FROM EMP_CATEGORIES)

    WHERE EMP_DEPT = 0020;

    10.用EXISTS替代IN,用NOT EXISTS替代NOT IN

    在许多基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行联接.在这种情况下, 使用EXISTS(或NOT EXISTS)通常将提高查询的效率.

    低效:

    SELECT *

    FROM EMP (基础表)

    WHERE EMPNO > 0

    AND DEPTNO IN (SELECT DEPTNO

    FROM DEPT

    WHERE LOC = ‘MELB’)

    高效:

    SELECT *

    FROM EMP (基础表)

    WHERE EMPNO > 0

    AND EXISTS (SELECT ‘X’

    FROM DEPT

    WHERE DEPT.DEPTNO = EMP.DEPTNO

    AND LOC = ‘MELB’)

    (相对来说,用NOT EXISTS替换NOT IN 将更显著地提高效率)

    在子查询中,NOT IN子句将执行一个内部的排序和合并. 无论在哪种情况下,NOT IN都是最低效的 (因为它对子查询中的表执行了一个全表遍历).   为了避免使用NOT IN ,我们可以把它改写成

    外连接(Outer Joins)或NOT EXISTS.

    例如:

    SELECT …

    FROM EMP

    WHERE DEPT_NO NOT IN (SELECT DEPT_NO

    FROM DEPT

    WHERE DEPT_CAT='A');

    为了提高效率.改写为:

    (方法一: 高效)

    SELECT ….

    FROM EMP A,DEPT B

    WHERE A.DEPT_NO = B.DEPT(+)

    AND B.DEPT_NO IS NULL

    AND B.DEPT_CAT(+) = 'A'

    (方法二: 最高效)

    SELECT ….

    FROM EMP E

    WHERE NOT EXISTS (SELECT 'X'

    FROM DEPT D

    WHERE D.DEPT_NO = E.DEPT_NO

    AND DEPT_CAT = 'A');

    当然,最高效率的方法是有表关联.直接两表关系对联的速度是最快的!

    11.识别'低效执行'的SQL语句

    用下列SQL工具找出低效SQL:

    SELECT EXECUTIONS , DISK_READS, BUFFER_GETS,

    ROUND((BUFFER_GETS-DISK_READS)/BUFFER_GETS,2) Hit_radio,

    ROUND(DISK_READS/EXECUTIONS,2) Reads_per_run,

    SQL_TEXT

    FROM    V$SQLAREA

    WHERE   EXECUTIONS>0

    AND      BUFFER_GETS > 0

    AND (BUFFER_GETS-DISK_READS)/BUFFER_GETS < 0.8

    ORDER BY 4 DESC;

    (虽然目前各种关于SQL优化的图形化工具层出不穷,但是写出自己的SQL工具来解决问题始终是一个最好的方法)

    更多相关内容
  • MySql多表查询优化

    千次阅读 2021-01-18 21:21:22
    一、多表查询连接的选择相信内连接,左连接什么的大家都比较熟悉了,当然还有左外连接什么的,基本用不上,我就补贴出来了,这个图只是让大家熟悉一下各种连接查询。然后要告诉大家的是,需要根据查询的信息,想好...

    一、多表查询连接的选择

    cbb2c043bff0c173e66748b3dd1d9782.png

    相信内连接,左连接什么的大家都比较熟悉了,当然还有左外连接什么的,基本用不上,我就补贴出来了,这个图只是让大家熟悉一下各种连接查询。然后要告诉大家的是,需要根据查询的信息,想好使用哪种连接方式效率更高。

    二、MySql的Join实现原理

    在MySql中,只有一种Join算法,就是大名鼎鼎的Nested Loop Join,它没有其他很多数据库提供的Hash Join,也米有Sort Merge Join,顾名思义,Nested Loop Join 实际上就是通过驱动表的结果集作为循环基础数据,然后一条一条的通过该结果集中的数据作为过滤条件到下一个标中查询数据,然后合并结果。如果还有第三个参数与Join,则再通过前面两个表的Join结果作为循环基础数据,再次通过循环查询条件到第三个表中查询数据,如此往复。

    三、补充:mysql对sql语句的容错问题。

    即在sql语句不完全符合书写建议的情况,mysql会允许这种情况,尽可能解释他:

    1)一版cross join后面加上where条件,但是用cross join + on 也是被解释为cross join + where;

    2)一版内链接都需要加上on限定条件,如上面场景一;如果不加会被解释为交叉连接;

    3)如果连接表格使用的是逗号,会被解释为交叉连接;

    注意:sql标准中还有union join 和 natural inner join,mysql不支持,而且本身也没有多大意义,其实就是为了“健壮”。但是其实结果可以用上面的几种连接方式得到。

    四、超大型数据见可能尽力不要写子查询,使用连接(join)去替换他

    当然,关于这句话,也不一定就全是这样。

    1)因为在大型的数据处理中,子查询是非常常见的,特别是在查询出来的数据需要进一步处理的情况,无论是可读性还是效率上,这时候的子查询都是更优。

    2)然而在一些特定的场景,可以直接从数据库读取就可以的,比如一个表(A表 a,b,c字段,需要内部数据交集)join自己的效率必然比放一个子查询再where中快得多。

    五、使用联合Union来代替手动创建得临时表

    Union是会把结果排序的!!

    union查询:它可以把需要使用临时表的两条或更多的select查询合并在一个查询中(即把两次或多次查询结果合并起来)。在客户端的查询会话结束的时候,临时表会被自动删除。从而保证数据库整齐、高效。使用union来创建查询的时候,我们只需要用union作为关键字把多个select语句连接起来就可以了,要注意的是所有select语句中的字段数据要相同。

    要求:两次查询的列数必须一致(列的类型可以不一样,但推荐查询的每一列,对应的数据类型要一样)可以来自多张表的数据,多次sql语句取出的列名可以不一致,此时以第一个sql语句的列名为准。如果不同的语句中取出的行,有完全相同(这里标识的是每个列的值都相同)。那么union会将相同的行合并,最终只保留一行,也可以这样理解,union会去掉重复的行。如果不想去掉重复的行,可以使用union all。

    如果子句中有order by,limit,需要括号()包起来,推荐放到所有子句之后,即对最终合并的结果来排序或者筛选。

    a4fe7136906030e7ef4fe9ad613136fc.png

    注意:

    1、Union结果集中的列名总是等于第一个select语句中的列名

    2、Union内部的select语句必须拥有相同数量的列,列也必须拥有相似的数据类型,同时,每条select语句中的列的顺序必须相同。

    Union all 的作用和语法:

    默认的,union操作符选取不同的值,如果允许重复的值,请使用union all,当all随union一起使用时,不消除重复行。

    b63af2b6e874ad438b010a36efec5b88.png

    六、总结

    (1)对于要求全面的结果时,我们需要使用连接操作(left join / right join / full join);

    (2)应尽量避免在where子句中对字段进行null值判断,否则导致引擎放弃使用索引而进行全表扫描,如:

    4dec2b874fb5389d2ad49f0045ea1932.png

    备注、描述、评论之类的可以设置为null,其它做好不要使用null。

    不要以为null不需要空间,比如:char(100)型,在字段建立时,控件就固定了,不管是否插入值(null也包含在内)。都是占用100个字符的空间的。如果是varchar这样的变长字段,null不占用空间。

    可以在null上设置默认值0,确保表中num列没有null值,然后这样查询:

    select id from t where num=0

    (3)in 和 not in 也要慎用,否则会导致全表扫描,如:

    9db5f0040125ec0066b9cc2e93c1c741.png

    很多时候,用exists代替in是个好的选择:

    2924040e90ed5344643ebc37d6982034.png

    (4)尽量使用数字类型字段,若只含数值信息的字段,尽量不要设计为字符型,这样会降低查询和连接的性能,并会增加存储开销,这是因为引擎在处理查询和连接时,会逐个比较字符串中每一个字符。而对于数字型而言,只需要对比一次就可以了。

    (5)尽量使用表变量来代替临时表,如果表变量包含大量数据,请注意索引使用非常有限(只有主键索引)。

    (6)不要以为使用mysql的一些连接查询操作对查询有多么大的改善,其核心时索引。

    展开全文
  • mysql中left join多表查询优化

    千次阅读 2019-07-11 16:24:26
    关于MYSQL 中left join 的sql优化的问题 最近碰到一个sql超级慢的案例示例如下建表语句如下执行时间约4秒中,速度太慢了,体验太差 最近碰到一个sql超级慢的案例示例如下 建表语句如下 CREATE TABLE `sys_dept` ( `...

    最近碰到一个sql超级慢的案例示例如下

    建表语句如下

    CREATE TABLE `sys_dept` (
      `dept_id` int(10) NOT NULL,
      `name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '部门名称',
      `sort` int(11) DEFAULT NULL COMMENT '排序',
      `create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
      `update_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
      `del_flag` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT '0' COMMENT '是否删除  -1:已删除  0:正常',
      `parent_id` int(10) DEFAULT '0' COMMENT '父id',
      `tenant_id` int(11) DEFAULT '1',
      PRIMARY KEY (`dept_id`) USING BTREE,
      KEY `index_dept_name` (`name`) USING BTREE,
      KEY `index_parent` (`parent_id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='部门管理';
    CREATE TABLE `sys_user` (
      `user_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
      `username` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '用户名',
      `password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '密码',
      `mail` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '邮箱',
      `cn` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'cn',
      `distinguished_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '辨别名称',
      `salt` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '随机盐',
      `name` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '姓名',
      `phone` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '手机号',
      `avatar` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '头像',
      `dept_id` varchar(60) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '部门ID',
      `create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
      `update_time` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
      `lock_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT '0' COMMENT '0-正常,9-锁定',
      `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT '0' COMMENT '0-正常,1-删除',
      `wx_openid` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '微信openid',
      `qq_openid` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'QQ openid',
      `tenant_id` int(11) DEFAULT '1' COMMENT '所属租户',
      PRIMARY KEY (`user_id`) USING BTREE,
      UNIQUE KEY `user_idx1_username` (`username`) USING BTREE,
      KEY `user_wx_openid` (`wx_openid`) USING BTREE,
      KEY `user_qq_openid` (`qq_openid`) USING BTREE,
      KEY `12312` (`dept_id`) USING BTREE,
      KEY `21322` (`user_id`,`username`,`dept_id`) USING BTREE
    ) ENGINE=InnoDB AUTO_INCREMENT=37549810 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='用户表';
    

    我们对这两张表中,表一月2000条数据,表二8000条数据执行sql如下:

    SELECT
    		`user`.user_id,
    		`user`.username,
    		`user`.name,
    		`user`.`password`,
    		`user`.salt,
    		`user`.distinguished_name,
    		`user`.cn,
    		`user`.mail,
    		`user`.phone,
    		`user`.avatar,
    		`user`.wx_openid,
    		`user`.qq_openid,
    		`user`.dept_id AS deptId,
    		`user`.create_time AS ucreate_time,
    		`user`.update_time AS uupdate_time,
    		`user`.del_flag AS udel_flag,
    		`user`.lock_flag AS lock_flag,
    		`user`.tenant_id AS tenantId ,
    		d.name
    		FROM
    		sys_user AS `user`
    		left join sys_dept d  
    		on `user`.dept_id=d.dept_id
    		ORDER BY `user`.create_time DESC
    

    执行时间约4秒中,速度太慢了,体验太差

    下面explain该sql语句如下图
    可以看得到,这是优化后的,
    也就是吧关联字段由原来的varchar改为int ,简直不是一个量级的,速度达到了17毫秒
    总结

    1. 表设计: 主键尽量int类型的字段进行关联,减少数据库查询条件,因为varchar将会有一个转换的过程;
    2. 关联字段最好创建索引;
    3. 数据量小的表尽量在前
    展开全文
  • 多表连接查询如何优化?

    千次阅读 2022-03-22 17:47:29
    多表连接查询优化方案

    在读完<<MySQL是怎样运行的>>这本书以后我就迫切的希望能发表一篇关于多表连接查询优化的文章,今天正好在这里可以大谈阔斧的将我所学的知识无私奉献给大家。

          多表连接查询是我们经常在工作中遇到的问题,解决这个问题,我想先从底层的MySQL数据库对于多表连接查询的处理说起,首先对于这种简单的查询:
    SELECT * FROM  s1, s2 WHERE s1.work_order_no = s2.work_order_no

    两表查询通过work_order_no消除笛卡尔积,MySQL会根据根节点定位到第一条记录,然后从B+树的叶子节点开始从左到右开始全表扫描,当扫描到一条记录就去s2表看该值是否存在于s2表,如果不存在就丢弃,继续下一条数据。判断是否存在于s2表的方法是看该列是否在s2表中能用到索引,如果不能那就全表扫描,也就是s1表(这里称之为驱动表)扫描一次,s2表(这里称之为被驱动表)扫描n次,那么两表查询查询的成本就是扫描s1表一次的时间✖️s2表扫描的时间,如果s2表不能通过索引来获得合理的扫描区间,那就需要用到全表扫描,我们这里做一个假设,假如驱动表(s1)表的扇出值(也就是查出来符合条件的值)是1000,而被驱动表(s2表)的全表扫描的时间是100毫秒,那么多表连接查询的时间成本就是1000✖️0.1=100秒(理论上是,当然后面还会讲到连接缓冲区进行优化),我们通常听到别人讲到的小表驱动大表的方法就是因为大表查询可以用索引进行优化(如果用到了索引理想状态下可以最少通过三次查询就能找到该值,时间消耗极低),降低每次查询被驱动表的时间,而扇出值一般是无法进行更改的,所以可以降低总的查询时长。

    下面我给大家讲一下什么是连接缓冲区 join buffer,这是一个系统变量,我们可以手动设置其大小,我们知道一次磁盘IO的速度是非常慢的,如果在内存中进行是非常快的,MySQL设计大叔正是利用这个特性, 在多表连接查询时,会提前将需要用到的页面加载到内存中,当然如果join buff的大小可以存放所有需要连接查询的数据会全部存放进来,不可以的话也会一部分在磁盘中存放,所以当我们的系统内存很大的时候可以适当提高该系统变量可以提升查询的效率。

         讲了这么多还没有将如何优化,优化的思路肯定是建索引,提高join buffer连接缓冲区的大小,当然我们也可以通过手动编程的方式实现,就是将我们需要查询的两张表数据都查询出来将其中一张表(数据多的) 转成Map,因为大家知道Map底层是通过hash找值得,也就相当于建立了hash索引,然后我们就可以提升查询的效率。

    我写了一份伪代码,可以供大家进行参考! 

    展开全文
  • sql 多表查询优化

    万次阅读 2011-12-04 20:26:17
    为了提高查询速度,提高数据库应用系统的执行效率,文章从分析关系数据库多表查询处理过程入手讨论查询优化技巧,指出多表查询优化的原则。通过几种优化策略的研究,在时间和空间上提高了系统的性能,在一定程度上...
  • MySQL多表关联查询优化

    千次阅读 2019-11-28 10:37:20
    最近在对运营报表导出进行优化,总结了一些多表关联查询优化的点记录一下。 避免临时表 通过 Explain 分析 SQL 语句,尽量不要使用到临时表。GROUP BY (Explain具体详解,可以看这篇博客) 最容易造成使用临时表,...
  • Oracle 多表联合查询优化

    千次阅读 2019-09-19 12:25:32
    假设高速缓冲里已经存储了执行过的sql语句,那就直接匹配执行了,少了步骤,自然就快了,但是经过测试会发现高速缓冲只对简单的表起作用,多表的情况完全没有效果,例如在查询单表的时候那叫一个快,但...
  • 比如我要查一张菜单,想查询名字为‘product’和子菜单名字为‘product’的菜单,下面是我写的语句。 请问这种怎么用join才代替in,或者有没有别的办法让效率变得高点 select * FROM menu As m where m.name = '...
  • Oracle 查询技巧与优化(二) 多表查询

    万次阅读 多人点赞 2016-08-05 08:59:59
    关于Oracle多表查询的一些技巧和优化~
  • MyBatis 多表联合查询优化

    万次阅读 多人点赞 2015-05-25 11:50:27
    序 ...但是吧,就我前几天在做一个多表联合查询的时候,竟然出了很多意想不到的问题,而且这些问题的出现,并不是对 mybatis 不了解,而是在用的过程中会或多或少的忽略一些东西,导致提示各种错误
  • mysql多表关联查询优化方法

    千次阅读 2021-02-08 05:48:27
    下面就对多表关联查询优化方法,举例说明。现在社区分享类网站很火,就拿方维购物分享网站举例说明吧。也是对二次开发方维购物分享网站的一点总结,高手可以飞过。购物分享的关键表有:分享表、图片表、文件表、...
  • MySQL多表查询核心优化

    万次阅读 多人点赞 2016-03-22 17:00:33
    在一般的项目开发中,对数据表的多表查询是必不可少的。而对于存在大量数据量的情况时(例如百万级数据量),我们就需要从数据库的各个方面来进行优化,本文就先从多表查询开始。
  • SQL Server多表查询优化方案总结

    千次阅读 2014-03-12 10:43:36
    SQL Server多表查询优化方案是本文我们主要要介绍的内容,本文我们给出了优化方案和具体的优化实例,接下来就让我们一起来了解一下这部分内容。 1.执行路径 ORACLE的这个功能大大地提高了SQL的执行性能并节省了...
  • mysql 多表查询语句优化

    千次阅读 2019-02-21 11:39:03
    很明显,MySQL选择了小作为驱动,再配合(hotel_id,hotel_type)上的索引瞬间降低了好个数量级。 一个关于left join 的通用法则,即:如果where条件中含有右的非空条件(除开is null),则left join语句等同...
  • 查询优化:SQL优化 场景:当列表展示的数据来自很多表中的数据时,由于...JOIN连接查询也很方便地获取到要返回的数据,但是问题来了,这么多表查询起来关联的数据非常多,查询耗时很大,甚至超过30秒,影响用户体...
  • 在一些大的公司里面,都会禁用多表连接查询,原因就是一旦数据量足够大的时候多表连接查询效率会很慢,而且不利于分库分表的查询优化。 例: SELECT p.id, sn.name AS nodeName, o.EndTs AS expiryTime, o....
  • 百万级数据连表查询优化

    千次阅读 2019-03-25 14:18:34
    交代一下背景,这算是一次项目经验吧,属于公司一个已上线平台的功能,这算是离职人员挖下的坑,随着数据越来越,原本的SQL查询变得越来越慢,用户体验特别差,因此SQL优化任务交到了我手上。 这个SQL查询关联两个...
  • MYSQL 多表连接查询优化

    万次阅读 2018-07-12 17:13:44
    交代一下背景,这算是一次项目经验吧,属于公司一个已上线平台的功能,这算是离职人员挖下的坑,随着数据越来越,原本的SQL查询变得越来越慢,用户体验特别差,因此SQL优化任务交到了我手上。 这个SQL查询关联两...
  • 1.1通过时间列将大分为个小,缩小数据范围,减少扫描纪录数,这样添加分区索引后存在个B+索引,单分区查询时相对应索引树也小 1.1.1 在本地任意盘符下创建存放小的文件夹 1.1.2 通过...
  • 这个功能大大地提高了SQL的执行性能并节省了内存的使用:我们发现,... buffering) ,这个功能并不适用于多连接查询..数据库管理员必须在init.ora中为这个区域设置合适的参数,当这个内存区域越大,就可以保留更的语句,
  • Mysql 多表联合查询效率分析及优化

    万次阅读 2018-11-06 19:03:35
    Mysql 多表联合查询效率分析及优化
  • mysql 多表关联查询时的优化

    千次阅读 2018-11-05 15:36:17
    mysql 多表关联查询时的优化 SELECT count(*) FROM enterprise_basic_information a, pd_one_year_result b, pd_one_year_result_sy c, credit_score d, statement_of_financial_position_merge_wind e...
  • 由于mysql的自动优化,在多表关联查询&大数据量下,可能出现没有使用最优索引或者最优驱动表。 2.方案: 使用 强制索引 force index,示例 SELECT * FROM TABLE1 FORCE INDEX (IDX_NAME) JOIN TABLE2 使用...
  • ORACLE多表查询优化

    千次阅读 2009-10-28 17:39:00
     ORACLE多表查询优化这里提供的是执行性能的优化,而不是后台数据库优化器资料:参考数据库开发性能方面的各种问题,收集了一些优化方案统计如下(当然,象索引等优化方案太过简单就不列入了,嘿嘿):执行路径:ORACLE的这...
  • 多表查询

    千次阅读 2022-02-10 15:29:43
    一、为什么需要多表查询? ????查询一个员工名为“Abel”的人在哪个城市工作? 1.先查询出他的全部信息 SELECT * FROM employees WHERE last_name = 'Abel'; 2.得知他在80号部门时,查询80号部门的信息 ...
  • 继续这一系列,上篇的简单查询优化并没讲完,第二点还有查询注意点以及多表查询优化呢!! 文章结构:(1)多表查询步步优化;(2)查询编写的注意点。 主要是内连接,外连接,交叉连接的详解(配图)。以及罗列出,...
  • MySQL查询优化

    千次阅读 多人点赞 2021-06-02 13:01:42
    1 SQL优化 show status 了解各种SQL的执行效率: # 查看本session的sql执行效率 show status like 'Com_%'; # 查看全局的统计结果 SHOW GLOBAL STATUS LIKE 'Com_%' # 查看服务器的状态 show global status; 结果...
  • Oracle查询优化-01单表查询

    千次阅读 2017-01-31 22:39:57
    1.1 查询表中所有的行与列1.2 从中检索部分行1.3 查找空值1.4 将空值转换为实际值1.5 查找满足个条件的行1.6 从中检索部分列1.7 为列取有意义的名称1.8 在 WHERE 子句中引用取别名的列1.9 拼接列1.10 在 ...
  • 十几个大left join的大SQL查询优化

    千次阅读 2022-01-16 12:36:53
    十几个大表left join的大SQL查询优化 问题 十几个表关联查询,有子查询,并表和left join表查询,由于近期上了生产,每天都有几万条应用,查询一个星期内的数据,用了几十分钟,导致触发熔断机制 获取生产环境中的...
  • MYSQL一次千万级连表查询优化(一)

    千次阅读 2018-09-28 14:07:06
    交代一下背景,这算是一次项目经验吧,属于公司一个已上线平台的功能,这算是离职人员挖下的坑,随着数据越来越,原本的SQL查询变得越来越慢,用户体验特别差,因此SQL优化任务交到了我手上。  这个SQL查询关联两...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 496,844
精华内容 198,737
关键字:

多表查询如何优化