【粗浅分析】关于外链接查询数据库性能影响,及底层机制分析

开始编辑时间:2016-06-17 19:16:57



  先交代下背景

    最近进行了一个小模块的开发,由于几个数据表之间的联动比较多,所以外链接次数也有几次。

    但是公司本来就是禁止随便使用外链接语句的,但是不用外链接的话达不到想要的效果(自己经验不够,想不到别的解决办法)。

    期间在网上搜索了一下有什么别的解决办法,但是效果都没有达到预期,而且看到也有人问过类似的问题,而且有很多人不理解为什么不用能外链接,还有的人说,不用外链接还用什么关系数据库。

    后来请教了上司,得出结果是外链接可以用,不过要小心注意。



  下面说说自己在项目中的实战理解:

    首先,看下面的SQL语句:

SELECT *
FROM articles a
LEFT JOIN comments c ON a.id=c.articles_id
LEFT JOIN users u ON a.user_id = u.id;

    首先自己分析了一下这个表在数据库到底做了什么动作:

    1. 首先a表全表查询了一次,这个应该毫无疑问;
    2. 为了找出每一条符合连接条件的记录,首先遍历每一条a表的每一条记录,在每一次的循环中,都需要对c表和u表进行全表查询查询,并且检查是否符合条件,如果符合条件则添加到结果表对应的记录后面   

    那么现在假设a表有50条数据,c表有20条,u表10条。

    那么最少就进行了50*20+50*10=1500次的全表查询。(这种数据量可能还感觉不到什么)

    但是如果当表中的数量再翻100倍,操作量变成1500万次。

    如果再把SQL语句改一下:

SELECT *
FROM articles a
LEFT JOIN comments c ON a.id=c.articles_id
LEFT JOIN users u ON c.user_id = u.id;

    操作就会变成a表全表查询1次,然后每一条记录全表查询c表一次,然后c表每一条记录又会全表查询u表一次。

    操作量模型就会变成:50*20*10=10000次,数据量翻100倍,操作量变成100亿次....

    然后我们可以考虑一下并发的问题....

    其实在现实中一些公司的某些的特定数据表达到更高的数据量是肯定的,如果不注意使用这类连接语句,一个并发服务器就死掉也并不是不可能。



    那么下面说说暂时解决方案(例子):

SELECT *
FROM articles a limit 0,10LEFT JOIN comments c ON a.id=c.articles_idLEFT JOIN users u ON c.user_id = u.id;

    这里先对a表做一个分页,那么整个模型一下子少了对于上面a表5000条数据,c表2000条数据量,u表1000条数据量的操作,模型就会变成10*2000*1000=2000万次。

    在实际应用中,我还对中间表(c表的位置)添加了条件:

...LEFT JOIN (Select * from comment where ....) c on a.id=c.articles_id....


编辑结束时间:2016-06-17 20:23:50    

时间: 2024-12-24 12:53:30

【粗浅分析】关于外链接查询数据库性能影响,及底层机制分析的相关文章

探究 Oracle 高水位对数据库性能影响

2016-08-11 陈龙 恩墨学院 探究 Oracle 高水位对数据库性能影响1大家好!我是来自云和恩墨的陈龙,目前主要负责Oracle技术支持工作.在我开始学习Oracle 的时候就听eygle老师说过,要想学好技术,一定要要多做实验,多做学习记录,理论与实践相结合,才能真正理解吸收那些知识,所以今天我想分享一下对Oracle高水位线与SQL访问性能相关性的研究体会.谈不上很深入的研究,只是想与大家分享我的Oracle学习过程,希望能与大家交流进步.之所以分享这个学习内容,是因为在我曾经经历

oracle数据库性能影响之Sql parse

1,Sql parse的种类 Sql parse又通常分为硬解析和软解析,当sql第一次执行的时候,会发生硬解析,之后的执行如果在shared pool中能找到就是软解析.因此,为提高数据性能,尽可能的让每次执行的SQL在shared pool找到. 2,SQL在哪些情况下会发送硬解析? 1)统计信息改变  2)Sql中的表上有做ddl操作,包括grant和revoke. 3)执行计划被踢出shared pool 4)开启了trace 5)绑定变量长度变化 6)启用outlin

mysql查询更新时的锁表机制分析(只介绍了MYISAM)

为了给高并发情况下的mysql进行更好的优化,有必要了解一下mysql查询更新时的锁表机制. 一.概述 MySQL有三种锁的级别:页级.表级.行级.MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking):BDB存储引擎采用的是页面锁(page-level locking),但也支持表级锁:InnoDB存储引擎既支持行级锁(row-level locking),也支持表级锁,但默认情况下是采用行级锁. MySQL这3种锁的特性可大致归纳如下: 表级锁:开销小,加

mysql查询更新时的锁表机制分析

为了给高并发情况下的mysql进行更好的优化,有必要了解一下mysql查询更新时的锁表机制. 一.概述 MySQL有三种锁的级别:页级.表级.行级.MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking):BDB存储引擎采用的是页面锁(page-level locking),但也支持表级锁:InnoDB存储引擎既支持行级锁(row-level locking),也支持表级锁,但默认情况下是采用行级锁. MySQL这3种锁的特性可大致归纳如下: 表级锁:开销小,加

SQL Server创建复合索引时,复合索引列顺序对查询的性能影响

说说复合索引 写索引的博客太多了,一直不想动手写,有一下两个原因:一是觉得有炒剩饭的嫌疑,有兄弟曾说:索引吗,只要在查询条件上建索引就行了,真的可以这么暴力吗?二来觉得,索引是个非常大的话题,很难概括出所有的情况,你不整出点新意来,倒是有抄袭照搬的嫌疑 既然写了,就写一点稍微不一样的东西出来,好了,废话打住,开搞 /* 20160814备注:今天发现一个类似的文章:http://www.cnblogs.com/fly_zj/archive/2012/08/11/2633629.html : 可以

书讯 —《产品级性能调优与故障诊断分析》

<产品级性能调优与故障诊断分析> 封面巨照 作者简介 郑健,2006~2009连任三届<微软最有价值专家>,荣获<DevWOW微软博客达人>优胜奖,荣获微软<最有影响力开发者>奖项,通过微软[MCSA/MCSE]认证,公司性能优化专家,CSDN 博客专家,著有[庖丁解牛:纵向切入Asp.net 3.5控件和组件开发技术]一书,目前在北京用友软件做产品优化方面的工作. Email: [email protected] 本书主要内容 一个运行中的系统会受到到很多

图书 —《产品级性能调优与故障诊断分析》

<产品级性能调优与故障诊断分析> 封面巨照 作者简介 郑健,2006~2009连任三届<微软最有价值专家>,荣获<DevWOW微软博客达人>优胜奖,荣获微软<最有影响力开发者>奖项,通过微软[MCSA/MCSE]认证,公司性能优化专家,CSDN 博客专家,著有[庖丁解牛:纵向切入Asp.net 3.5控件和组件开发技术]一书,目前在北京用友软件做产品优化方面的工作. Email: [email protected] 本书主要内容 一个运行中的系统会受到到很多

MySQL数据库性能优化专题

摘录: 书:<MySQL性能调优与架构设计> 一个系列: (按顺序排一下) MySQL 数据库性能优化之缓存参数优化 http://isky000.com/database/mysql-perfornamce-tuning-cache-parameter MySQL 数据库性能优化之表结构优化 http://isky000.com/database/mysql-perfornamce-tuning-schema MySQL 数据库性能优化之索引优化 http://isky000.com/dat

表连接查询与where后使用子查询的性能分析。

子查询就是在一条查询语句中还有其它的查询语句,主查询得到的结果依赖于子查询的结果. 子查询的子语句可以在一条sql语句的FROM,JOIN,和WHERE后面,本文主要针对在WHERE后面使用子查询与表连接查询的性能做出一点分析. 对于表连接查询和子查询性能的讨论众说纷纭,普遍认为的是表连接查询的性能要高于子查询.本文将从实验的角度,对这两种查询的性能做出验证,并就实验结果分析两种查询手段的执行流程对性能的影响. 首先准备两张表 1,访问日志表mm_log有150829条记录(相关sql文件已放在