关于sql查询性能优化的一点心得

1.合理构建表

对于数据量大的表,缩减不必要的字段长度,保证表的大小。

 

2.用列名代替"select *"这种写法

select * 需要遍历转换所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间。

 

3.给表添加索引

查询时给需要 where、join on 的字段添加索引。

(避免全表扫描,全表扫描通常是因为在 WHERE 子句中使用了索引中没有的字段时发生)

大数据量时设置索引可以一定程度的优化查询,但同时会降低增、删、改的性能,因为每次操作之后都需要修改索引,

所以索引虽好,可不要滥用哦~

 

以下一些情况推荐使用索引:

- 最大的限制条件返回表的数据库小于表总数据量的 10%
- 最大的限制条件在 SQL 语句中是经常使用的
- 条件列的索相将会返回一个唯一的值
- 列经常被 ORDER BY或 GROUP BY 子句所引用

 

另外要注意索引列上的NULL的影响(不太懂,暂不多作介绍)

 

--奉上索引相关的sql语句:

  >---给表添加普通索引

alter table 表名 add index 索引名 (列名);

  >---查询表的索引

show index from 表名;

  >---删除表的索引

drop index 索引名 ON 表名;

 

4.少用子查询

只能说是尽量吧,明确sql结果的需求,重新梳理一遍sql结构。

 

5.连接查询时注意减少表的大小

先减少单表的大小,再控制连接的结果表要尽可能的小,减少重复和无效的数据,才能提高查询性能。

 

--连接查询介绍:

  >---内连接 A join B on A.id=B.id;  [又写做:inner join]

只返回条件匹配的行,不匹配的行不会显示

等效于:select * from A,B where A.id=B.id;

select * from A cross join B where A.id=B.id (cross join 后只能用where不能用on)

  >---左外连接 A left join B on A.id=B.id;

结果是显示A表的所有行及B表的匹配行,B表不匹配的行显示NULL

  >---右外连接 A right join B on A.id=B.id;

结果是显示A表的匹配行及B表的所有行,A表不匹配的行显示NULL

  >---交叉连接 A cross join B;

即笛卡尔积,A所有行*B所有行

等效于:select * from A,B;

 

6.where子句的顺序

Oracle重那些可以过滤掉最大数量记录的条件必须写在where子句的末尾。

因为Oracle老版本中对SQL语句的解析是从后往前顺序解析的。这样在WHERE语句最后写的条件会首先被运行,可以最大限度地过滤掉无用的数据,提高SQL运行速度。现在ORACLE改进了解析方式,能自动分析,先运行过滤数据大的条件和有索引的条件。所以是不是写在最后并不重要了。。

--举例:

如果表中大多数数据都不符合字段a<2000,则把该条件子句放在后面。

 

7.group by,order by等子句的使用

在尽可能多的过滤掉表中不需要的记录后再使用这些性能较低的子句。

 

---------------------------------------------------------------------------------------------------------------------------------------------------------------

不是很全面,最近给一句sql进行优化的时候现学现卖了一下,自己还有待提高。很多也是前辈们的经验心得,在此鉴戒了。

你可能感兴趣的:(站在巨人的肩膀上)