SQL优化的思路与技巧
SQL优化
对于关系型数据库而言。随着数据量的增加,SQL语句的优劣对系统的响应速度的影响越来越明显,SQL优化也成为每一个数据相关工作人员的必备技能。以下是我工作,学习的总结与大家分享,如发现不合理或错误的地方欢迎大家及时指出,共同交流、共同成长。
SQL优化的可以从以下几个大方面去考虑:1.使用索引,避免全表扫描。2.使用临时表存放中间结果。
1、使用索引,避免全表扫描
在关系数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。数据库使用索引以找到特定值,然后顺指针找到包含该值的行。(来自百度文库)
如果不使用索引系统会将将所有记录一一取出,和查询条件进行一一对比,然后返回满足条件的记录,这样做会消耗大量数据库系统时间,并造成大量磁盘I/O操作,因此在SQL语句的执行过程中让优化器使用索引,避免全表扫描变得尤为重要。那么优化器会根据何种原则来删除索引呢,下面是几个常见的场景:
LIKE的使用
通配符出现在首位,无法使用索引,反之可以。
-- 无法使用索引
SELECT .. FROM .. WHERE NAME LIKE '%T%' ;
-- 可以使用索引
SELECT .. FROM .. WHERE NAME LIKE 'T%' ;
OR的使用
索引列上的OR操作会造成全表扫描。在索引列上,可以使用UNION替换OR操作。
-- 低效:
SELECT COLUMNA ,COLUMNB ,COLUMNC FROM LOCATION WHERE COLUMNA=10 OR COLUMNC ='MELBOURNE'
-- 高效:
SELECT COLUMNA , COLUMNB , COLUMNC FROM LOCATION WHERE COLUMNA = 10
UNION
SELECT COLUMNA , COLUMNB , COLUMNC FROM LOCATION WHERE COLUMNC = 'MELBOURNE'
IN 或 NOT IN的使用
IN和NOT IN 要慎用,否则会导致全表扫描。
--BETWEEN替换IN
1 SELECT COLUMNA FROM A WHERE NUM IN(1,2,3) --会造成全表扫描
2 SELECT COLUMNA FROM A WHERE NUM BETWEEN 1 AND 3 --不会造成全表扫描
--EXIST替换IN
1 SELECT COLUMNA FROM A WHERE NUM IN(SELECT NUM FROM B ) --会造成全表扫描
2 SELECT NUM FROM A WHERE NUM EXISTS(SELECT 1 FROM B WHERE B.NUM = A.NUM) --不会造成全表扫描
--LEFT JOIN替换IN
1 SELECT COLUMNA FROM A WHERE NUM IN(SELECT NUM FROM B) --会造成全表扫描
2 SELECT COLUMNA FROM A LEFT JOIN B ON A.NUM = B.NUM --不会造成全表扫描
ORDER BY
ORDER BY子句中不要使用非索引列或嵌套表达式,这样都会导致性能降低。
NULL列
NULL列使用索引没有意义,任何包含NULL值的列都不会被包含在索引中。因此WHERE语句中的IS NULL或IS NOT NULL的语句优化器是不允许使用索引的。
函数
在WHERE条件里不要在索引列上使用函数或者表达式,这样会停止使用索引,进行全表扫描,如下:
-- 错误
SELECT … FROM A WHERE COLUMNA * 12 > 25000;
-- 正确
SELECT … FROM A WHERE COLUMNA > 25000/12;
2.使用临时表存放中间结果
对于那种需要进行多重嵌套的情况,可以使用临时表或者物化视图先将数据落下来再进行操作。
本文地址:https://blog.csdn.net/qq_32389231/article/details/108580638