SQL常用调优手段
Wallace Xu 2021-08-09 数据库
好的SQL语句对操作数据库的速度影响至关重要,除了建立索引之外,保持良好的SQL编写习惯对SQL性能提升又很大的帮助。下面记录几点常用的SQL调优手段。
# 01 使用预编译的SQL语句
SQL语句会保存在缓存中,只要SQL语句本身有变化就会导致重新解析。此外,使用占位符?
也可以防止SQL注入。
//正例
string query = "SELECT name FROM user WHERE id = ?";
//反例
string query = "SELECT name FROM user WHERE id = " + id;
1
2
3
4
2
3
4
# 02 不要使用SELECT *
使用星号会将很多不需要的字段(包括隐藏字段)给查询出来,带来不必要的性能损失。
# 03 小心使用模糊查询
使用模糊查询时,如果pattern以%开头,将导致索引失效。
# 04 不要使用列号,优先使用列名
使用列号将增加不必要的解析时间。
//正例
string query = "SELECT name, age FROM user ORDER BY name, age";
//反例
string query = "SELECT name, age FROM user ORDER BY 2, 3";
1
2
3
4
2
3
4
# 05 优先使用UNION ALL,避免使用UNION
UNION会将各查询子集的记录作比较,速度较慢。UNION ALL不去重,可以接受重复的情况下应优先使用。
# 06 避免在SQL语句中对索引字段进行计算操作
应当先计算好值之后再传入到SQL中,在索引列上进行计算操作会导致索引失效。例如<>
、!=
、IS NULL
以及函数等。
# 07 使用NOT EXISTS代替NOT IN
如果使用了NOT IN,那么内外表都会进行全表扫描,索引失效。NOT EXISTS的子查询可以使用到索引。
EXISTS是对外表进行loop循环,每次循环再对内表进行查询,使用到了内表的索引;而IN会将内外表进行连接,最终用到的是外表索引。因此需要根据内外表相对的大小确定要使用哪一种方式。
# 08 只知道只有1条查询结果
使用LIMIT 1
来保证找到结果后就不在继续扫描,避免全表扫描。