11.24 不多说,干货。#如何提高SQL查询的效率?#

写在前面:本文仅仅适用于数据分析者,DBA直接无视就好。

1. select子句中尽量避免使用*

2. 尽量避免使用in和not in

in和not in也会导致数据库进行全表搜索,增加运行时间。比如,我想看看第8、9个人的学号和成绩,大多数同学会用这个语句:

select 学号, 成绩 from 成绩表 where 学号 in (8, 9)

这一类语句,优化方法如下:

select 学号, 成绩 from 成绩表 where 学号 between 8 and 9

3.使用limit子句限制返回的数据行数

如果前台只需要显示15行数据,而你的查询结果集返回了1万行,那么这适合最好使用limt子句来限制查询返回的数据行数。

4. 尽量避免使用or

or同样会导致数据库进项全表搜索。在工作中,如果你只想用or从几十万语句中取几条出来,是非常划不来的,怎么办呢?下面的方法可替代or。

从成绩表中选出成绩是是88分或89分学生的学号:

select 学号 from 成绩表 where 成绩 = 88 or 成绩 = 89

优化后:

select 学号 from 成绩表 where 成绩 = 88 union select 学号 from 成绩表 where 成绩 = 89

语句虽然变长了一点,但处理大量数据时,可以省下很多时间,是非常值得的。

5. where子句比较符号左侧避免函数

尽量避免在where条件子句中,比较符号的左侧出现表达式、函数等操作。因为这会导致数据库引擎进行全表扫描,从而增加运行时间。

举个例子,下图是10名学生的成绩表,老师突然发现因为参考答案出错,给所有人都少加了5分,现在需要查询:给每人加5分后,成绩依然在90分以上的同学的学号。

按照题目的思路直接书写,“给每人加5分后,成绩90分以上”的条件很多人会这样写:

where 成绩 + 5 > 90 (表达式在比较符号的左侧)

优化方法:

where 成绩 > 90 – 5(表达式在比较符号的右侧)

所以,为了提高效率,where子句中遇到函数或加减乘除的运算,应当将其移到比较符号的右侧。