常见SQL编写和优化

Kevin501 等级 704 0 0
标签: sql优化后端

常见的SQL优化方式

  1. 对查询进行优化,应尽量避免全表扫描,首先应考虑在where及order by 涉及的列上建立索引

  2. 应尽量避免在 where 子句中对字段进行null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:

select id from t where num is null 

可以在num上设置默认值0,确保表中num列是否存在null值,然后这样查询:

select id from t where num = 0 
  1. 应尽量避免在 where 子句中使用 !=或<> 操作符,否则将引擎放弃使用索引而进行全表扫描。

  2. 应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,

如:

select id from t where num = 10 or num = 20 

可以这样查询:

select id from t where num=10    
union all    
select id from t where num=20 

对于union, 优先使用union all, 避免使用union。

UNION 因为会将各查询子集的记录做比较,故比起UNION ALL ,通常速度都会慢上许多。

一般来说,如果使用UNION ALL能满足要求的话,务必使用UNION ALL。

  1. in 和 not in 慎用,否则会导致全表扫描,如:
select id from t where num in (1,2,3) 

对于连续的数值,能用 between 就不要用 in 了:

select id from t where num between 1 and 3 
  1. 慎用模糊查询,使用 like 两边加“%”--造成索引失效。
    左边没有%,这个索引不会失效。下面的查询将导致全表扫描:
select id from t where name like '%abc%' 
  1. 应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。如:
select id from t where num / 2 = 100 

应改为:

select id from t where num = 100 * 2 
  1. 应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。
    如:
select id from t where substring(name,1,3)='abc'--name以abc开头的id 

应改为(like 统计第6点):

select id from t where name like 'abc%' 
  1. 不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。

  2. 在使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,
    否则该索引将不会被使用,并且应尽可能的让字段顺序与索引顺序相一致。

  3. 不要写一些没有意义的查询,如需要生成一个空表结构:

select col1,col2 into #t from t where 1=0 

这类代码不会返回任何结果集,但是会消耗系统资源的,应改成这样:

create table #t(...) 
  1. in和exist。in 是把外表和内表作hash 连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询。因此,in用到的是外表的索引, exists用到的是内表的索引。

如果查询的两个表大小相当,那么用in和exists差别不大,

如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in

select num from a where num in(select num from b) 

用下面的语句替换:

select num from a where exists(select 1 from b where num=a.num) 
  1. 并不是所有索引对查询都有效,SQL是根据表中数据来进行查询优化的,当索引列有大量数据重复时,SQL查询可能不会去利用索引,
    如一表中有字段sex,male、female几乎各一半,那么即使在sex上建了索引也对查询效率起不了作用。

  2. 索引并不是越多越好,索引固然可以提高相应的 select 的效率,但同时也降低了 insert 及 update 的效率,
    因为 insert 或 update 时有可能会重建索引,所以怎样建索引需要慎重考虑,视具体情况而定。
    一个表的索引数最好不要超过6个,若太多则应考虑一些不常使用到的列上建的索引是否有必要。

  3. 尽量使用数字型字段,若只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的性能,并会增加存储开销。
    这是因为引擎在处理查询和连接时会逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了。

  4. 尽可能的使用 varchar 代替 char ,因为首先变长字段存储空间小,可以节省存储空间,
    其次对于查询来说,在一个相对较小的字段内搜索效率显然要高些。

  5. 任何地方都不要使用 select * from t ,用具体的字段列表代替“*”,不要返回用不到的任何字段。

  6. 避免频繁创建和删除临时表,以减少系统表资源的消耗。
    临时表并不是不可使用,适当地使用它们可以使某些例程更有效,例如,当需要重复引用大型表或常用表中的某个数据集时。但是,对于一次性事件,最好使用导出表。

  7. 在新建临时表时,如果一次性插入数据量很大,那么可以使用 select into 代替 create table,避免造成大量 log ,
    以提高速度;如果数据量不大,为了缓和系统表的资源,应先create table,然后insert

  8. 如果使用到了临时表,在存储过程的最后务必将所有的临时表显式删除,先 truncate table ,然后 drop table ,这样可以避免系统表的较长时间锁定。

  9. 尽量避免使用游标,因为游标的效率较差,如果游标操作的数据超过1万行,那么就应该考虑改写。
    使用基于游标的方法或临时表方法之前,应先寻找基于集的解决方案来解决问题,基于集的方法通常更有效。

  10. 与临时表一样,游标并不是不可使用。对小型数据集使用 FAST_FORWARD 游标通常要优于其他逐行处理方法,尤其是在必须引用几个表才能获得所需的数据时。
    在结果集中包括“合计”的例程通常要比使用游标执行的速度快。如果开发时间允许,基于游标的方法和基于集的方法都可以尝试一下,看哪一种方法的效果更好。

  11. 尽量避免大事务操作,提高系统并发能力。

  12. 尽量避免向客户端返回大数据量,若数据量过大,应该考虑相应需求是否合理

参考:https://blog.csdn.net/jie_liang/article/details/77340905
https://blog.csdn.net/weixin_40792878/article/details/81071584

收藏
评论区

相关推荐

SQL
当数据库中数据量特别大的时候,查询的速度就比较慢,这时候需要添加索引,来提高查询速度。 索引的优点 1>通过创建唯一索引,可以保证数据库表中每行数据的唯一性。 2>加快数据查询速度 3>在使用分组和排序进行数据查询时,可以显著的减少查询中分组和排序的时间 索引的缺点 1>维护索引需要消耗数据库资源 2>索引需要占用磁盘空间,索引文件可能会比数据
SQL
      今天要和大家分享的是最近新学的SQL-Server查询数据库的内容       数据库贴近我们的生活,渗透在生活的方方面面,几乎处处都能用到。先来给大家介绍一下数据库。数据库能够高效的条理分明的存储数据,它的优势有以下几点:        1. 可以结构化存储大量的数据信息,方便用户高效的检索。        2. 可以满足数据的共享和安全
SQL慢查询
(一)慢sql一 ======== ### 问题发现 将应用发布到生产环境后,前端页面请求后台API返回数据,发现至少需要6s。查看到慢sql: ![](https://oscimg.oschina.net/oscnet/a81e2a47-6511-4fd1-a6e6-9d7146abe179.jpg "慢sql定位.png") 慢sql定位.png
MySQL 权重搜索
SQL 匹配 \_ 和 % ------------- SQL的模式匹配允许你使用“_”匹配任何单个字符,而“%”匹配任意数目字符(包括零个字符)。在 MySQL中,SQL的模式缺省是忽略大小写的。 注意在你使用SQL模式时,你不能使用=或!=;而使用LIKE或NOT LIKE比较操作符。 语法:SELECT 字段 FROM 表 WHERE 某字段 Lik
MySQL中怎样快速找出超长索引
大家好,我是知数堂SQL 优化班老师 网名:骑龟的兔子 ![](https://oscimg.oschina.net/oscnet/137ab31a-a252-4650-a455-c5d59fc79144.jpg) 需求: 想要查找哪些索引太长了,这个SQL在5.7下跑的特别慢,8.0则挺快的,帮看下有啥优化方案没 具体SQL 和执行计划如下
Oracle自带工具sql优化集
如何有效的诊断和监控高负载的SQL对于DBA来说并非是件容易的事情,对SQL语句手工调优需要很多的经验和技巧,       结合个人经验常见如下问题:           . 对SQL语句本身进行优化以便获得更优的执行计划;           . 合理地调整数据读取方式(例如通过索引)以便能更快地访问数据;           . 合理的设计
oracle多表查询
SQL> --等值连接 SQL> --查询员工信息:员工号  姓名 月薪 部门名称 SQL> set linesize 80 SQL> desc dept  名称                                      是否为空? 类型  -----------------------------------------
Hive SQL使用过程中的奇怪现象
hive是基于Hadoop的一个数据仓库工具,用来进行数据的ETL,这是一种可以存储、查询和分析存储在Hadoop中的大规模数据的机制。hive能将结构化的数据文件映射为一张数据库表,并提供SQL查询功能。Hive SQL是一种类SQL语言,与关系型数据库所支持的SQL语法存在微小的差异。本文对比MySQL和Hive所支持的SQL语法,发现相同的SQL语句在
JFinal3.0 sql管理与动态生成
[原文:](https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fwww.jianshu.com%2Fp%2F99e14864e7cd) 本节学习目标主要是使用JFinal中自带的Template Engin来实现对sql的管理。JFinal中为sql管理提供了3个指令#sql、#para、#n
PHP开发web应用安全总结
### 一、SQL注入攻击(SQL Injection) 攻击者把SQL命令插入到Web表单的输入域或页面请求的字符串,欺骗服务器执行恶意的SQL命令。在某些表单中,用户输入的内容直接用来构造(或者影响)动态SQL命令,或作为存储过程的输入参数,这类表单特别容易受到SQL注入式攻击。常见的SQL注入式攻击过程类如: 1.某个Web应用有一个登录页面,这
SQL on Hadoop性能对比-Hive、Spark SQL、Impala
------- 1 三种语言、三套工具、三个架构 ------------------- > **不了解SQL on Hadoop三驾马车-Hive、Spark SQL、Impala吗?听小编慢慢道来** 1 **Hive** Apache Hive数据仓库软件提供对存储在分布式中的大型数据集的查询和管理,它本
Spark SQL重点知识总结
一、Spark SQL的概念理解 ================ Spark SQL是spark套件中一个模板,它将数据的计算任务通过SQL的形式转换成了RDD的计算,类似于Hive通过SQL的形式将数据的计算任务转换成了MapReduce。 **Spark SQL的特点:** 1、和Spark Core的无缝集成,可以在写整个RDD应用的时候,配
SQL on Hadoop性能对比-Hive、Spark SQL、Impala
------- 1 三种语言、三套工具、三个架构 ------------------- > **不了解SQL on Hadoop三驾马车-Hive、Spark SQL、Impala吗?听小编慢慢道来** 1 **Hive** Apache Hive数据仓库软件提供对存储在分布式中的大型数据集的查询和管理,它本
TiDB SQL Engine Team:纯手工打磨前沿的优化器和执行引擎|PingCAP 招聘季
“SQL at SCALE”(出自 [PingCAP 官网](https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fpingcap.com%2Findex.html))是我们对 TiDB 的一个精简概括,而我们 TiDB SQL Engine Team 正是负责这 3 个单词中的 “SQL” 部分
sql实现同环比(同比,环比)
sql实现同比,环比 环比和同比用于描述统计数据的变化情况。 公式:      同比增长率=(本期数-同期数)÷同期数×100% SQL图片示例: ![](https://oscimg.oschina.net/oscnet/bd003453694f71f3dcc5766c496f14d33d4.gif) SQL代码: