mysql数据库优化及sql调优,mysql的查询优化
http://blog..net/daybreak1209/article/details/51638187
1.mysql查询类型(默认情况下查询所有数据列)
1.内部连接
默认多表关联查询方式,查询两个表中的所有字段;您可以省略inner join关键字。
2.通过外部连接可以找到某个表中的所有数据。
(1)左侧连接
查询第一个表中的所有字段。
(2)正确连接
查询第二个表中的所有字段,如果第一个表中的匹配数据为null,则返回null。
3.子连接
-通过内部联接找到bookID=book type ID的记录。
SELECT tb.bookName,tby.bookTypeName FROM t_book tb,t_bookType tby其中TB . book typeid=tby . id;
-外部连接(左侧连接)
SELECT tb.bookName,tby . book typename FROM t _ book LEFT JOIN t _ book上的t _ book type . book typeid=t _ book type . id其中.
-外部连接(右侧连接)
SELECT tb.bookName,tby . book typename FROM t _ book RIGHT JOIN t _ book上的t _ book type . book typeid=t _ book type . id其中.
-子查询
SELECT * FROM t _ book WHERE book typeid IN(SELECT id FROM t _ book type);
SELECT * FROM t _ book WHERE book type id NOT IN(SELECT id FROM t _ book type);
SELECT * FROM t _ book WHERE price=(SELECT price FROM t _ price level WHERE price level=1);
SELECT * FROM t _ book WHERE EXISTS(SELECT * FROM t _ book type);
SELECT * FROM t _ book WHERE NOT exist(SELECT * FROM t _ book type);
SELECT * FROM t _ book WHERE price=ANY(SELECT price FROM t _ price level);
SELECT * FROM t _ book WHERE price=ALL(SELECT price FROM t _ price level);
二、查询优化思路
1.为什么慢?
在尝试优化查询之前,您必须了解是什么使查询变慢。如果把查询看成一个由n个子任务组成的任务,随着子任务的增加,sql关联查询也会增加;优化,其实就是对这n个子任务进行优化,要么去掉一些子任务,要么减少子任务的数量。
2.子任务是什么?
mysql执行一个查询一般有几个过程:客户端向服务器发送查询语句——,服务器解析查询语句3354生成执行计划3354执行查询;执行是整个生命周期中最重要的阶段,包括调用、排序、分组数据库引擎的数据处理过程。
三、优化方向
1.优化查询数据
查询效率低的基本原因是:访问的数据太多,必然需要大量的筛选工作;
错误:select * from t _ user内部联接t _ role r内部联接t _ permission p其中.
错误:使用内部联接找到了三个表中的所有数据列。
正确做法:从t _ user inn join t _ role r inner join t _ permission p中选择t.name,r.rolename,p.pname其中
2.拆分查询
分而治之,把复杂的查询切割成小查询,每个查询只返回一小部分结果。
错误:select * from t _ user t where to create data date _ sub(now(),interval 3month)
delete from t _ user t where created data DATE _ SUB(NOW(),间隔3个月)
错误:当用户表数据量巨大时,一次性查询或删除表中大量数据会导致等待暂停;
正确做法:select * from t _ user t where创建数据date _ sub (now(),interval 3month)限制0,1000;
首先查询表中前1000条符合条件的数据;
3.分解关联的查询
错误:select t.name,r.rolename,p . pname from t _ user inn join t _ role r inner join t _ permission p where。
错误:当用户表数据量巨大时,一次性查询或删除表中大量数据会导致等待暂停;
正确做法:select * from t_user其中t.age=10
从t_user中选择t. rolename,其中.
select t. pname from t_user其中.
分解查询表面上看起来是一条sql完成的,现在却要三条sql完成。事实上,它比关联查询有更多的优点:
(1)提高缓存效率:对于第二条查询语句,第一条查询中记录age=10的所有字段都已经缓存在mysql中。
(2)减少单个查询之间的锁竞争。
(3)减少冗余字段的查询。
四。摘要
在平时的应用中,尤其是在java开发中,提供了很好的数据持久化框架,和mysql的查询优化没有过多的关联。另外,在使用sql执行查询时,可能会经常用到多表关联查询。在使用这些sql拼接的过程中,一定要了解一下sql优化。在处理高并发的问题上,除了web服务器前端加载、并行扩展等措施外,数据库高并发的解决方案也同样重要,而且这一条一条sql。