概要:
sql语句优化(也叫慢sql优化)
性能不理想的系统中除了一部分是因为应用程序的负载确实超过了服务器的实际处理能力外,更多的是因为系统存在大量的SQL语句需要优化
sql优化:
(1)常见的简化规则如下:
1.不要有超过5个以上的表连接(JOIN)
2.考虑使用临时表或表变量存放中间结果。
3.少用子查询
4.视图嵌套不要过深,一般视图嵌套不要超过2个为宜
5.为了加快查询速度,优化查询效率,主要原则就是应尽量避免全表扫描,应该考虑在where及order by 涉及的列上建立索引。
6.where条件语句中 对索引进行了运算或者类型,导致索引失效造成全表扫描
注意: 一张表索引不要超过6个,不然索引底层数据结构 对索引的维护会加长耗时
(2)因为sql语句使用不当 进行优化
1. ORDER BY + LIMIT组合的索引优化
如果一个SQL语句形如:
SELECT [column1],[column2],…. FROM [TABLE] ORDER BY [sort] LIMIT [offset],[LIMIT];
这个SQL语句优化比较简单,在[sort]这个栏位上建立索引即可。
2. select * from table_name
要用具体的表的列名 代替" * “,因为” * " 会造成进行全表扫描
3. like语句优化
当where语句使用like通配符的时候
例 where name like '%彭于晏%';
这样会造成索引失效,导致全表扫描
正确的用法是:
where name like '彭于晏%';
4.尽量不要使用 BY RAND()命令
BY RAND()是随机显示结果,这个函数可能会为表中每一个独立的行执行BY RAND()命令,这个会消耗处理器的处理能力。
5. 在不需要去重结果集的时候,尽量用 union all 替换 union
union和union all的区别是:union会自动压缩多个结果集合中的重复结果,而union all则将所有的结果全部显示出来,不管是不是重复。
Union对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序;
UNION在进行表链接将结果集 合并后会 再进行唯一性过滤操作,筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果。这就会涉及到排序,增加大量的cpu运算,加大资源消耗及延迟。
实际大部分应用中是不会产生重复的记录,最常见的是过程表与历史表UNION
Union All对两个结果集进行并集操作,包括重复行,不进行排序;
如果返回的两个结果集中有重复的数据,那么返回的结果集就会包含重复的数据了。
6.Inner join 和 left join、right join、子查询
第一:inner join内连接也叫等值连接是,left/right join是外连接。
经过多方面的证实inner join性能比较快,因为inner join是等值连接,或许返回的行数比较少。但是我们要记得有些语句隐形的用到了等值连接,如:
SELECT A.id,A.name,B.id,B.name FROM A,B WHERE A.id = B.id;
7.exist 和 in视情况而定
SELECT * from A WHERE idin (SELECT id from B)
SELECT * from A WHERE id EXISTS(SELECT 1 from A.id= B.id)
in 是在内存中遍历比较
exist 需要查询数据库,所以当B的数据量比较大时,exists效率优于in.
in()只执行一次,把B表中的所有id字段缓存起来,之后检查A表的id是否与B表中的id相等,如果id相等则将A表的记录加入到结果集中,直到遍历完A表的所有记录。
in()适合B表比A表数据小的情况,exists()适合B表比A表数据大的情况
总结:
如何使一个性能缓慢的系统运行更快更高效,不但需要整体分析数据库系统,找出系统的性能瓶颈,更需要优化数据库系统发出的SQL 语句。
就是对 数据库性能,表结构,索引,sql语句的一个优化