MySQL数据库优化(五)—MySQL查询优化
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了MySQL数据库优化(五)—MySQL查询优化,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3648字,纯文字阅读大概需要6分钟。
内容图文
![MySQL数据库优化(五)—MySQL查询优化](/upload/InfoBanner/zyjiaocheng/539/7eabca84cb864607b72dfaff7a3ff97c.jpg)
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就是应多高并发的优化基础,不容小觑。
以上就是MySQL数据库优化(五)—MySQL查询优化的内容,更多相关内容请关注PHP中文网(www.gxlcms.com)!
内容总结
以上是互联网集市为您收集整理的MySQL数据库优化(五)—MySQL查询优化全部内容,希望文章能够帮你解决MySQL数据库优化(五)—MySQL查询优化所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。