Wallace's Blog

vuePress-theme-reco Wallace Xu    2019 - 2024
Wallace's Blog Wallace's Blog

Choose mode

  • dark
  • auto
  • light
主页
分类
  • 个人随笔
  • 知海拾贝
  • LeetCode
  • 剑指Offer
  • 自学技术
标签
时间轴
联系我
  • GitHub (opens new window)
  • 邮箱 (opens new window)
author-avatar

Wallace Xu

146

文章

53

标签

主页
分类
  • 个人随笔
  • 知海拾贝
  • LeetCode
  • 剑指Offer
  • 自学技术
标签
时间轴
联系我
  • GitHub (opens new window)
  • 邮箱 (opens new window)
  • 数据库

    • 数据库知识学习巩固
    • SQL常用调优手段

SQL常用调优手段

vuePress-theme-reco Wallace Xu    2019 - 2024

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

# 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

# 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来保证找到结果后就不在继续扫描,避免全表扫描。

# 09 多用EXPLAIN去查看一条SQL的执行计划

我是Wallace欢迎你的关注
看板娘