SQL优化与分析

本文深入探讨 SQL 优化,从 SQL 的基本概念、常用关键字的解释,到 SQL 优化策略,包括 DQL 优化和其他方面的调整。通过具体的优化案例,展示了如何分析和改进 SQL 查询,从而提高执行效率。最后,总结了编写高效 SQL 应避免的问题。
摘要由CSDN通过智能技术生成

前言:要做好 SQL 优化,我们先聊一聊在编写 SQL 时要经常用到的一些关键词,看看这些关键词的用途,以及应该如何使用;然后讨论下,一条 SQL 是如何被执行的,再根据 SQL 的执行规范说一说应该怎么写出高效的 SQL,最后拿出一个栗子,来分析下应该如何对问题 SQL 进行优化。

一、先说一说什么是 SQL

我们先看一看百度百科中关于 SQL 的描述

结构化查询语言 (Structured Query Language) ,简称 SQL,是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统;同时也是数据库脚本文件的扩展名。

标准的 SQL 包含 6 个组成部分,分别是:

  • 数据查询语言(DQL):用来检索数据,是最常用的 SQL,基本关键词(select)
  • 数据操作语言(DML):用来修改数据,如插入、更新、删除,基本关键词(insert,update,delete)
  • 事务处理语言(TPL):用来确保事务操作正常有效,基本关键词(commit,rollback)
  • 数据控制语言(DCL):用来进行数据权限控制,一般用来分配用户、角色以及数据可访问范围,基本关键词(grant,deny)
  • 数据定义语言(DDL):用来定义数据格式、关系,基本关键词(create table)
  • 指针控制语言(CCL):用来控制数据游标在不同数据行之间跳转,基本关键词(cursor)

  我们常说的优化,大部分所指的就是对使用数据查询语言编写的 SQL 在执行效率方面进行优化。

  当然,SQL 优化也不单单只有 DQL 优化,有时,为了满足效率预期,我们也需要对其他方面进行调整。

二、名词解释

  在讲解如何优化 SQL 之前,我们先介绍几个关键字,这些关键字大家在日常的开发中肯定经常用到,但具体是做什么用的恐怕就不那么清楚了,所以,让我们先从这些“最熟悉的陌生人”开始,对我们的工作内容做一个深度了解。

  1. select:这个是 DQL 最常见的关键字,我们基本上用在了所有的查询开始的地方,在 DQL 语句中,select 表示一个查询的开始或者一个子查询的开始,紧跟在 select后面的就是我们要从数据库中提取后返回给调用方的数据项,当 select后面跟随一个 *时,表示我们要将所有查询到的数据项都返回;
  2. from:99.999% 的 DQL 中都会包含 from关键字,它用来标识我们要查询的数据的来源,from后面可以是数据表(table),视图(view)甚至是另一个 DQL (子查询)from后面可以跟随一个或多个数据来源,使用 “,” (西文半角逗号)进行分割;

在某些数据库中,如 MySQL,在调用一个函数或直接返回一个自定义常量时可以不写 from 关键字,如我们配置在数据库连接池中,为连接对象验活的语句 select 1,或者直接调用一个函数,如查询当前数据库服务器时间 select now(),但不是所有的数据库都支持省略 from 关键字,如 ORACLE,所以为了保证数据库兼容,我们要求不能省略 from关键字,像上面两个语句,要改写为 select 1 from dualselect now() from dual,dual 是数据库中提供的一个只有一列的系统表,一般我们称之为伪表或虚拟表。

  1. inner join:用来做两个数据来源的关联使用,使用 on 关键字来进行数据关联,一般用在多表(视图)查询上,一般 inner join 也可以写为逗号分隔的方式,然后将 on 条件转义到 where 中;使用 inner join 只有当数据来源存在时,才会返回数据;
  2. join:join 就是对 inner join 的简写
  3. left join:左外连接,也可简称左连接,当使用 left join 进行关联时,处于 left join 后方的数据来源如果不存在满足条件的数据记录,但其他数据来源存在相关记录,则返回除此来源外的其他数据项,此来源数据项返回 null
  4. right join:右外连接,也可简称右连接,数据返回情况如 left join 相似,但区别是只要 right join 后方的数据来源存在符合条件的记录即返回数据;
  5. full join:可以看做是 left join ∪ right join,也就是只要有满足条件的数据,就会返回,这个用的比较少;
  6. where:条件起始关键字,跟随在 where 关键字后的就是数据查询条件,我看大家在写 SQL 经常会在 where 后面跟一个 1=1,貌似是方便了查询条件的拼写,但是,这个在某些数据库或者引擎下是会影响执行效率的,应该尽量避免;
  7. in:一般用在一个数据项符合多个条件时,但是,in 操作很慢,如果可能的话,还是写 exists 子查询比较好,还有,如果要使用的 in 条件选项很多的情况,jdbc 可能是无法执行的,如 1000 个以上,这时就要考虑其他方法了;
  8. like:做模糊查询时使用,使用左右 “%” 来进行匹配,如果使用左侧 % ,查询的时候用不上索引;
  9. group by:数据项分组,一般配合聚合函数,如 sum avg 等使用,如果需要对分组结果在进行筛选的话,需要配合 having 关键字;
  10. order by:结果排序;
四、优化策略

  不同的数据库甚至同一个数据库不同的数据引擎在 SQL 处理上都会存在差异,而咱们最常用的数据库是 MySQL,所以,咱们的优化策略主要针对的就是 MySQL,其他类型的数据库优化方案大家可以 Google 或者百度。

  要想做好 SQL 优化,我们需要先明白 MySQL 在执行一个 SQL 时的顺序,一条 SQL 是由多个完成不同任务的关键字组成的,而一个最完整的 SQL 大概是下面这样:

select
    < select_list >
from
    < left_table > < join_type >
join
    < right_table > ON < join_condition >
where
    < where_condition >
group by
    < group_by_list >
having 
    < having_condition >
order by
    < order_by_condition >
limit < limit_number >

  咱们跳过最底层的 SQL 检查和解析部分,直接看最终的执行顺序

-- 上面那个 SQL 在 MySQL 引擎中的执行顺序是这样滴
from 
    <left_table>
on 
    <join_condition> <join_type
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值