MySQL数据库优化(五)——MySQL查询优化

MySQL数据库优化(五)——MySQL查询优化

http://blog.csdn.net/daybreak1209/article/details/51638187

一、mysql查询类型(默认查询出所有数据列)
1、内连接 
     默认多表关联查询方式,查询出两个表中所有字段;可省略inner join 关键字
2、外连接 查询出某一张表中的所有数据
(1)左连接
      查询出第一张表的所有字段
(2)右连接
 查询出第二张表的所有字段,表一匹配数据为空的返回null

3、子连接

--内连接  查询出bookID=book类型ID的记录    
SELECT tb.bookName,tby.bookTypeName FROM t_book tb,t_bookType tby WHERE tb.bookTypeId=tby.id;  
  
--外连接(左连接)  
SELECT  tb.bookName,tby.bookTypeName FROM t_book LEFT JOIN t_bookType ON t_book.bookTypeId=t_bookType.id where ......;  
--外连接(右连接)  
SELECT  tb.bookName,tby.bookTypeName FROM t_book RIGHT JOIN t_bookType ON t_book.bookTypeId=t_bookType.id where ......;  
  
--子查询  
SELECT * FROM t_book WHERE booktypeId IN (SELECT id FROM t_booktype);  
SELECT * FROM t_book WHERE booktypeId NOT IN (SELECT id FROM t_booktype);  
SELECT * FROM t_book WHERE price>=(SELECT price FROM t_pricelevel WHERE priceLevel=1);  
SELECT * FROM t_book WHERE EXISTS (SELECT * FROM t_booktype);  
SELECT * FROM t_book WHERE NOT EXISTS (SELECT * FROM t_booktype);  
SELECT * FROM t_book WHERE price>= ANY (SELECT price FROM t_pricelevel);  
SELECT * FROM t_book WHERE price>= ALL (SELECT price FROM t_pricelevel); 

 

二、查询优化思路
1、为什么会慢?
     在尝试做查询优化之前,得明白是什么让查询变慢?如果把查询看作一个由n个子任务组成的任务,随着子任务增多,sql关联查询也增多;优化查询,实际上就是优化这n个子任务,要么消除一些子任务,要么减少子任务执行次数。
2、有哪些子任务?
     mysql执行一个查询一般有这么几个流程:客户端发送查询语句到服务端——>服务器解析查询语句——>生成执行计划——>执行查询;其中执行时整个生命周期最重要的阶段,其中包括对数据库引擎的调用、排序、分组的数据处理过程。
三、优化方向
1、优化查询数据
     低效的查询基本原因:访问请求的数据太多,不可避免的需要进行大量筛选工作;
     错误尝试:select * from t_user t inner join t_role r inner join t_permission p where …..
     错误原因:使用内连接,查询出三个表中的所有数据列
     正确方式:select t.name,r.rolename,p.pname from t_user t inner join t_role r inner join t_permission p where
2、切分查询
      分而治之,将复杂的查询切分成小查询,每次查询只返回一小部分结果
      错误尝试:select * from t_user t where createData>DATE_SUB(NOW(),INTERVAL 3 MONTH)
                       delete from t_user t where createData>DATE_SUB(NOW(),INTERVAL 3 MONTH)
     错误原因:当user表中数据量巨大时,一次性查询或删除表中大量数据均会导致等待停顿;
     正确方式:select * from t_user t  where createData>DATE_SUB(NOW(),INTERVAL 3 MONTH)  limit 0,1000;
                     先查询表中符合条件的前一1000条数据;
3、分解关联查询
      错误尝试:select t.name,r.rolename,p.pname from t_user t inner join t_role r inner join t_permission p where
      错误原因:当user表中数据量巨大时,一次性查询或删除表中大量数据均会导致等待停顿;
      正确方式:select * from t_user where  t.age=10;
                       select t. rolename from t_user where …
                       select t. pname from t_user where …
       分解关联查询表面上好像原本1个sql就干完的事,现在非得由3个sql去完成,实际上它比关联查询更有优势:
(1)提高缓存效率:对于第一条查询中age=10这条记录的所有字段已经缓存在mysql中,供第二个查询语句使用
(2)减少单个查询间的锁竞争
(3)减少冗余字段的查询     
四、总结
     在平时的应用中,尤其在在java开发提供了良好的数据持久化框架,对于mysql的查询优化并未过分关系,并且在使用sql执行查询时,可能也经常使用到多表关联查询,在使用这些sql拼接的过程中,对于sql优化不能不知晓,在应对高并发问题中,除了在web服务器前做负载、平行扩展等措施之外,数据库高并发的解决方案也与其并重,而这一个一个sql就是应多高并发的优化基础,不容小觑。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/113569.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • JAVA求数组的平均数,众数,中位数[通俗易懂]

    JAVA求数组的平均数,众数,中位数[通俗易懂]目录1、名称解释2、实例代码(1)求平均数(2)求中位数(3)求众数1、名称解释平均数:是指一组数据之和,除以这组数的个数,所得的结果就是平均数。中位数:中位数是指把一组数据从小到大排列,如果这组数据的个数是奇数,那最中间那个就是中位数,如果这组数据的个数为偶数,那就把中间的两个数之和除以2,所得的结果就是中位数。众数:众数是指一组数据中出现次数最多的那个数,众数可以是0个或多个。2、实例代码(1)求平均数publicstaticdoublem..

  • Response.Flush()的用处

    Response.Flush()的用处Response.Flush()的作用是将缓冲信息输出到页面。比如我们在点击一个按钮后,执行多个任务,每个任务执行成功后都有一个Response.Write(‘成功信息’)。如果我们在Respons

  • 如何在pycharm运行python_pycharm怎么运行部分代码

    如何在pycharm运行python_pycharm怎么运行部分代码这篇文章主要介绍了Pycharm如何运行.py文件的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧!Pycharm时一个非常好用的IDE,但是一开始的时候甚至会因为.py文件不能运行而束手无策。。。这里需要说明一下Pycharm的作用,Pycharm并不是一个像matlab那样什么都自己提供的软件,它更像一个非常棒的…

  • MySQL重设密码_mysql重置密码命令

    MySQL重设密码_mysql重置密码命令1.首先确认服务器出于安全的状态,也就是没有人能够任意地连接MySQL数据库。因为在重新设置MySQL的root密码的期间,MySQL数据库完全出于没有密码保护的状态下,其他的用户也可以任意地登录和修改MySQL的信息。可以采用将MySQL对外的端口封闭,并且停止Apache以及所有的用户进程的方法实现服务器的准安全状态。最安全的状态是到服务器的Console上面操作,并且拔掉网线。2.修改MyS…

    2022年10月16日
  • 网页中嵌入特殊字体

    网页中嵌入特殊字体

  • 决策树的原理_决策树特征选择

    决策树的原理_决策树特征选择决策树的原理:根据树结构进行决策,可以用于分类和回归。一颗决策树包括一个根结点、若干个内部节点和若干个叶节点。从根节点出发,对每个特征划分数据集并计算信息增益(或者增益率,基尼系数),选择信息增益最大的特征作为划分特征,依次递归,直至特征划分时信息增益很小或无特征可划分,形成决策树。决策树优点1.计算复杂度不高;2.输出结果易于理解;3.不需要数据预处理;4…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号