在对数据库进行操作时,如果SQL语句书写不当,对程序的效率会造成很大影响。

提高SQL效率可以从一下几个方面入手:

1,数据库设计与规划

  • Primary Key字段的长度尽量小,能用small integer就不要用integer。例如对于员工数据表,如果能用员工编号做主键,就不要用身份证号码。
  • 字符字段如果长度固定,就不要用varchar或nvarchar类型,而应该用char或nchar类型。例如身份证号码、银行密码等字段。
  • 字符长度如果长度不固定,则应该使用varchar或nvarchar类型。除了可节省存储空间外,存取硬盘也会有效率。例如地址、个人介绍等。
  • 涉及字段时,如果其值可有可无,最好也给一个默认值,并设成不允许NULL。因为有些数据库在存放和查询有NULL的数据表时,会花费额外的运算动作,例如SQL Server数据库。

2,适当地创建索引

  • Primary Key字段可以自动地创建索引,而Foreign Key字段不可以。为Foreign Key字段手动创建索引,即使是很少被JOIN的数据表也有必要这么做。
  • 为经常被查询或排序的字段创建索引。
  • 创建索引字段的长度不宜过长,不要用超过20个字节的字段,例如地址等。
  • 不要为内容重复性高德字段创建索引,例如性别等。
  • 不要为使用率低的字段建立索引。
  • 不宜为过多字段建立索引,否则会影响到INSERT、UPDATE和DELETE语句的性能。
  • 如果数据表存放的数据很少,就不必刻意使用索引。

3,使用索引功能

  在查询数据表时,使用索引查询可以极大提升查询速度,但是如果where子句书写不当,即使某些列存在索引,也不能使用该索引查询,而同样会使用全表扫描,这就造成了查询速度的降低。在where语句中避免使用一下关键字:

  NOT、!=、<>、!>、!<、EXISTS、IN、LIKE、||。

  使用LIKE关键字做模糊查询时,即使已经为某个字段建立了索引,但需要以常量字符开头才会用到索引,如果以“%”开头则不会使用索引。例如name like '%To‘ 不启用name字段上的索引;而 name like ‘To%’会启用name字段上的索引。

4,避免在where子句中对字段使用函数

5,AND与OR的使用

  在AND运算中,只要有一个条件用到索引,即可大幅提升查询速度。但在OR运算中,则要所有的条件都有使用到索引才能提升查询速度,因此使用OR运算符需要特别小心。

6,JOIN与子查询

  相对于子查询,如果能使用JOIN完成的查询,一般建议使用后者。原因除了JOIN的语法较容易理解外,在多数的情况下,JOIN的性能也会比子查询高。

7,其它查询技巧

  DISTINCT、ORDER BY语法,会让数据库做额外的计算。如果没有要过滤重复记录的需求,使用UNION ALL会比UNION更好,因为后者会加入类似DISTINCT的算法。

8,尽可能使用存储过程(Stored Procedure)

  Stored Procedure除了经过事先编译、性能较好以外,也可能减少SQL语句在网络上的传递,方便商业逻辑的重复使用。

如何提升SQL语句的查询性能的更多相关文章

  1. mysql 常用 sql 语句 - 快速查询

    Mysql 常用 sql 语句 - 快速查询 1.mysql 基础 1.1 mysql 交互         1.1.1 mysql 连接             mysql.exe -hPup    ...

  2. SQL 语句在查询分析器执行很快,程序 Dapper 参数化查询就很慢(parameter-sniffing)

    这个问题困扰我好长时间了,使用SQLSERVER 事务探查器找到执行超时的SQL语句,参数查询都是通过执行exe sp_executesql 的存储过程调用,因为它能够分析并缓存查询计划,从而优化查询 ...

  3. MySQL的EXPLAIN命令用于SQL语句的查询执行计划

    MySQL的EXPLAIN命令用于SQL语句的查询执行计划(QEP).这条命令的输出结果能够让我们了解MySQL 优化器是如何执行SQL 语句的.这条命令并没有提供任何调整建议,但它能够提供重要的信息 ...

  4. SQL语句之查询(SELECT)

    目录 SQL语句之查询(SELECT) 简单查询 限定查询 模糊查询 排序查询 多表查询 SQL语句之查询(SELECT) SQL是用于访问和处理数据库的标准计算机语言: 中文:结构化查询语言:英文全 ...

  5. SQL语句在查询分析器中可以执行,代码中不能执行

    问题:SQL语句在查询分析器中可以执行,代码中不能执行 解答:sql中包含数据库的关键字,将关键字用[]括起来,可以解决. 后记:建数据库的时候尽量避免使用关键字. 例子: sql.Format(&q ...

  6. 如何在 Linux 上用 SQL 语句来查询 Apache 日志

    Linux 有一个显著的特点,在正常情况下,你可以通过日志分析系统日志来了解你的系统中发生了什么,或正在发生什么.的确,系统日志是系统管理员在解决系统和应用问题时最需要的第一手资源.我们将在这篇文章中 ...

  7. 在Hibernate中使用HibernateTemplate来进行包含sql语句的查询

    /**     * 使用sql语句进行查询操作     * @param sql     * @return     */    public List queryWithSql(final Stri ...

  8. Sql语句之查询所有学生所有科目分数及总分

    昨天练Sql语句,数据库建了四个表分别是,学生表,课程表,成绩表以及教师表(教师表不在讨论范围),突然想到以前高中时代老师手上的那张成绩表,然后我就寻思着能不能用Sql语句把表打印出来,以下是我的思考 ...

  9. Python与开源GIS:在OGR中使用SQL语句进行查询

    摘要: 属性选择与空间选择都可以看作是OGR内置的选择功能,这两种功能可以解决大部分实际中的问题.但是也有这种时候,就是进行查询时的条件比较复杂.针对这种情况,OGR也提供了更加灵活的解决方案:支持使 ...

随机推荐

  1. 轻量数据库SQLiteDataBase的相关操作方法

    一.查询操作: 查询操作比较复杂,主要有如下操作: db.rawQuery(String sql, String[] selectionArgs); db.query(String table, St ...

  2. linux ssh 经常断开 的解决方法

    1.现象 在linux ,用ssh进行远程连接时,经常会发生长时间后断线,或者是无响应,就像卡住的感觉(键盘输入不进去). 2.解决方法 在ssh客户端的linux设置 # sudo vim /etc ...

  3. dubbo之集群容错

    在集群调用失败时,Dubbo 提供了多种容错方案,缺省为 failover 重试. 集群容错模式 1. Failover Cluster 失败自动切换,当出现失败,重试其它服务器 .通常用于读操作,但 ...

  4. WebForm 登陆test

    <script> window.onload = function () { document.getElementById("form1").onsubmit = f ...

  5. react性能调谐与diff算法

    一个页面其实就相当于是一颗dom树,里面有很多它的子节点,然后你每次去操作一个事件,它都会生成一个虚拟dom,它会跟上一个虚拟dom进行比对,这里运用的算法叫做diff算法,当它找到需要改变的组件的时 ...

  6. Java中StringTokenizer类的使用

    StringTokenizer是一个用来分隔String的应用类,相当于VB的split函数. 1.构造函数 public StringTokenizer(String str) public Str ...

  7. AndroidStudio 内存泄漏的分析过程

    前言部分这次泄漏是自己代码写的太随意引起的,讲道理,代码写的太为所欲为了,导致有些问题根本就很难发现. 泄漏产生的原因,由于activity未被回收导致.这里给我们提出的一个警示,在使用上下文的时候, ...

  8. 宏、预编译(day12)

    指针数组里的每个存储区是一个指针类型 的存储区 字符指针数组里包含多个字符类型指针,其中 每个指针可以表示一个字符串 字符指针数组可以用来表示多个相关字符串 主函数的第二个参数是一个字符指针数组, 其 ...

  9. 解决HTML select控件 设置属性 disabled 后无法向后台传值的方法

    大家都知道有时候修改数据的时候我们希望有一些数据是不可以修改的,通常情况下我们会将input框设置为 readonly , 但是 select 控件没有这个属性,需要使用另一个属性 disabled ...

  10. js中三个默认方法call,applay,bind

    这三个都是函数自带的方法(Function.prototype),这三个方法都能够改变函数内部 this的指向, call //call方法接收三个参数,第一个是this指向,第二个,三个是传递给函数 ...