首页 > 数据库 >SQL语句优化

SQL语句优化

时间:2023-08-20 10:46:42浏览次数:32  
标签:语句 优化 WHERE 索引 搜索 SQL where select

  一、操作符优化

  1. IN、NOT IN 操作符

  IN和EXISTS 性能有外表和内表区分的,但是在大数据量的表中推荐用EXISTS 代替IN 。

  Not IN 不走索引的是绝对不能用的,可以用NOT EXISTS 代替

  2. IS NULL 或IS NOT NULL操作

    索引是不索引空值的,所以这样的操作不能使用索引,可以用其他的办法处理,例如:数字类型,判断大于0,字符串类型设置一个默认值,判断是否等于默认值即可

  3. <> 操作符(不等于)   不等于操作符是永远不会用到索引的,因此对它的处理只会产生全表扫描。 用其它相同功能的操作运算代替,如 a<>0 改为 a>0 or a<0    a<>’’ 改为 a>’’

  4. 用全文搜索搜索文本数据,取代like搜索

  全文搜索始终优于like搜索:

  (1)全文搜索让你可以实现like不能完成的复杂搜索,如搜索一个单词或一个短语,搜索一个与另一个单词或短语相近的单词或短语,或者是搜索同义词;

  (2)实现全文搜索比实现like搜索更容易(特别是复杂的搜索);

 

  二、SQL语句优化

  1、在查询中不要使用  select *

为什么不能使用,地球人都知道,但是很多人都习惯这样用,要明白能省就省,而且这样查询数据库不能利用“覆盖索引”了

  2. 尽量写WHERE子句

  尽量不要写没有WHERE的SQL语句

  3. 注意SELECT INTO后的WHERE子句

  因为SELECT INTO把数据插入到临时表,这个过程会锁定一些系统表,如果这个WHERE子句返回的数据过多或者速度太慢,会造成系统表长期锁定,诸塞其他进程。   4.对于聚合查询,可以用HAVING子句进一步限定返回的行

  5. 避免使用临时表

  (1)除非却有需要,否则应尽量避免使用临时表,相反,可以使用表变量代替;

  (2)大多数时候(99%),表变量驻扎在内存中,因此速度比临时表更快,临时表驻扎在TempDb数据库中,因此临时表上的操作需要跨数据库通信,速度自然慢。

 

  6.减少访问数据库的次数:

   程序设计中最好将一些常用的全局变量表放在内存中或者用其他的方式减少数据库的访问次数

  7.尽量少做重复的工作   尽量减少无效工作,但是这一点的侧重点在客户端程序,需要注意的如下:   A、 控制同一语句的多次执行,特别是一些基础数据的多次执行是很多程序员很少注意的
  B、减少多次的数据转换,也许需要数据转换是设计的问题,但是减少次数是程序员可以做到的。
  C、杜绝不必要的子查询和连接表,子查询在执行计划一般解释成外连接,多余的连接表带来额外的开销。
  D、合并对同一表同一条件的多次UPDATE,比如   UPDATE EMPLOYEE SET FNAME=’HAIWER’ WHERE EMP_ID=’ VPA30890F’   UPDATE EMPLOYEE SET LNAME=’YANG’ WHERE EMP_ID=’ VPA30890F’   这两个语句应该合并成以下一个语句   UPDATE EMPLOYEE SET FNAME=’HAIWER’,LNAME=’YANG’    WHERE EMP_ID=’ VPA30890F’

  E、UPDATE操作不要拆成DELETE操作+INSERT操作的形式,虽然功能相同,但是性能差别是很大的。
  F、不要写一些没有意义的查询,比如     SELECT * FROM EMPLOYEE WHERE 1=2

  三、where使用原则

  1)在下面两条select语句中:   select * from table1 where field1<=10000 and field1>=0;   select * from table1 where field1>=0 and field1<=10000;   如果数据表中的数据field1都>=0,则第一条select语句要比第二条select语句效率高的多,因为第二条select语句的第一个条件耗费了大量的系统资源。   第一个原则:在where子句中应把最具限制性的条件放在最前面。  

 2)在下面的select语句中:   select * from tab where a=… and b=… and c=…;   若有索引index(a,b,c),则where子句中字段的顺序应和索引中字段顺序一致。   第二个原则:where子句中字段的顺序应和索引中字段顺序一致。

  以下假设在field1上有唯一索引I1,在field2上有非唯一索引I2。  

 3) select field3,field4 from tb where field1='sdf' 快   select * from tb where field1='sdf' 慢,   因为后者在索引扫描后要多一步ROWID表访问。

  select field3,field4 from tb where field1>='sdf' 快   select field3,field4 from tb where field1>'sdf' 慢   因为前者可以迅速定位索引。

  select field3,field4 from tb where field2 like 'R%' 快   select field3,field4 from tb where field2 like '%R' 慢,   因为后者不使用索引。

  4) 使用函数如:   select field3,field4 from tb where upper(field2)='RMN'不使用索引。   如果一个表有两万条记录,建议不使用函数;如果一个表有五万条以上记录,严格禁止使用函数!两万条记录以下没有限制。

标签:语句,优化,WHERE,索引,搜索,SQL,where,select
From: https://www.cnblogs.com/5tomorrow/p/17643688.html

相关文章

  • Sql Server数据库自身优化
    优化①:增加次数据文件,设置文件自动增长(粗略数据分区)  1.1:增加次数据文件从SQLSERVER2005开始,数据库不默认生成NDF数据文件,一般情况下有一个主数据文件(MDF)就够了,但是有些大型的数据库,由于信息很多,而且查询频繁,所以为了提高查询速度,可以把一些表或者一些表中的部分记录......
  • SQL Server索引
    SQL索引在数据库优化中占有一个非常大的比例,一个好的索引的设计,可以让你的效率提高几十甚至几百倍,在这里将带你一步步揭开他的神秘面纱。1.1什么是索引?SQL索引有两种,聚集索引和非聚集索引,索引主要目的是提高了SQLServer系统的性能,加快数据的查询速度与减少系统的响......
  • 一次Greenplum 查询性能优化
    最近接手一个实际查询调优的活儿,对方说Greenplum的性能太弱了,于是按网上教程调整了许多参数。当然,有些有点儿用,有些没什么用。于是几经周折。我们首先做了硬件设备的性能测试,就用Greenplum自带的工具进行:gpcheckperf-fall_segments-S512G-d/gpdata因为偷懒,就没测那么大。......
  • PHP查询MySQL 数据库后返回中文为问号
    面向对象1$conn=newmysqli($servername,$user,$password);3增加$conn->query("setnamesutf8");$pdo=newPDO("mysql:host=$servername",$username,$password);增加$pdo->query("setnamesutf8");  面向过程$conn=mysql......
  • 3.go语言控制语句
    目录本篇前瞻Leetcode习题9题目描述题目分析代码编写知识点归纳控制结构顺序结构(Sequence)声明和赋值算术运算符位运算符逻辑运算分支结构if语句switch语句逻辑表达式fallthrough类型推断循环语句continuebreakgotoLeetcode习题69题目描述题目分析代码编写本篇小结下篇预告本篇......
  • Django 登录页面优化的报错总结
    Django登录页面优化的报错总结在登录页面进行优化过程中,遇到的一些报错这边总结了一些希望会对读者有所帮助。调用new_key=CaptchaStore.generate_key()报错在调用CaptchaStore.generate_key()时出现错误,请确保您已正确设置了django-simple-captcha库。请按照以下步骤检查......
  • Django之登录页面优化--添加验证码
    Django之登录页面优化--添加验证码前面写的Django项目,前端登录页面较简单如下图,为了美化操作这边优化了前端登录页面。为了只专注登录页面优化这边新构建一个项目用于测试,后续在CV使用到其他项目上。 创建项目及应用django-adminstartprojectmyprojectcdmyprojectpy......
  • SQL 相关博客
    文章来源: SQLServer存储过程-hoojo-博客园(cnblogs.com) ---SQLServer存储过程--存储过程Procedure是一组为了完成特定功能的SQL语句集合,经编译后存储在数据库中,用户通过指定存储过程的名称并给出参数来执行。--存储过程中可以包含逻辑控制语句和数据操纵语句,它......
  • Django登录页面优化--动态验证码
    Django登录页面优化--动态验证码本章节添加修改动态验证码功能,基于前一章使用的前端环境进行代码修改。安装依赖库pipinstallPillowpipinstalldjango-simple-captcha添加captcha应用在myproject/settings.py文件的INSTALLED_APPS列表中添加captcha应用 INSTALLED......
  • df_sql_str
    #!/usr/bin/envpython#-*-encoding:utf-8-*-importpandasaspdimportnumpyasnp#生成一个dfdates=pd.date_range('20210913',periods=6)df=pd.DataFrame(np.random.randn(6,4),index=dates,columns=list('ABCD'))print(df)#定义df输入源,以及目标......