工作中我们经常会遇到系统查询慢的情况,一般我们会采取好多方法进行优化,如建立索引,优化查询Sql,分表,规范数据表结构设计,调整数据库参数(内存分配、缓存等),增加硬件配置,优化网络环境等。下面介绍两种常用的优化方法,遵循其中的一些原则,可以解决很多常见的问题。

一、索引设计

建立一个好的索引,对于查询效率,会有一个立竿见影的效果。但索引并不是多多益善,如果建立的不合适,提升的效果微乎其微。下面是一些我在工作中常用到的原则:
1、在经常作为查询条件的字段上创建索引
2、在经常进行Group by,Order by的字段上建立索引
3、在主键、外键字段上建立索引
4、查询频率高的表适合建立索引
5、避免在具有较少值的字段上建立索引,如性别等
6、避免在经常更新(写操作)的字段上建立索引
7、在经常存取的多个列上建立复合索引,字段的顺序应按照使用频率来确定,频率高的在前
8、唯一性差的字段避免使用索引
9、避免选择大型数据类型的列作为索引,如大的文本等。
10、一张表的索引不宜太多,一般不超过6个
11、含有NULL值的字段,避免使用索引,否则将放弃索引而进行全表扫描
12、避免在索引列上使用计算
13、定期分析执行效率,重建索引(rebuild)

二、查询优化

1、不要使用过多的表连接查询(join)
2、少用子查询,尽量使用外连接代替子查询
3、视图嵌套不要过深
4、使用临时表来存放中间结果
5、少用模糊查询
6、优化where子句中的!=或<>

--如SQL:
SELECT id FROM A WHERE ID != 5
--优化成:
SELECT id FROM A WHERE ID>5 OR ID<5

7、优化where子句中in或not in
第一种情况:exist代替in,数据量比较大时,exists效率优于in

--如SQL:
SELECT id FROM A WHERE num in(select num from b )
--优化成:
SELECT num FROM A WHERE num exists(select 1 from B where B.num = A.num)

第二种情况:left join代替in

--如SQL:
SELECT id FROM A WHERE num in(select num from B)
--优化成:
SELECT id FROM A LEFT JOIN B ON A.num = B.num

第三种情况:between替换in

--如SQL:
SELECT id FROM A WHERE num in(1,2,3)
--优化成:
SELECT id FROM A WHERE num between 1 and 3

8、应尽量避免在 where 子句中对字段进行 null 值判断,否则将会进行全表扫描
9、不要在where子句中的“=”左边进行函数、算数运算或其他表达式运算

--如SQL:
SELECT id FROM A WHERE num/2 = 100
--优化成:
SELECT id FROM A WHERE num = 100*2

10、不要使用select * from table,用具体的字段代替*
11、尽量避免类型转换
12、尽量用 union all 替换 union
13、能用inner join连接尽量使用inner join连接,因为inner join是等值连接,或许返回的行数比较少
14、使用外连接(left/right join)时候,应该用小的结果驱动打的结果。left join 左边表结果尽量小,如果有条件应该放到左边先处理,right join同理反向
15、尽量避免使用游标
16、一些复杂的逻辑或者需要定期执行的语句,可以做成存储过程。存储过程可以减少编译时间,客户端与服务器的交互时间等

除了以上常用的优化方法,还有分表、调整数据库参数(内存分配、缓存等)、增加数据文件等方法。关于DBA运维,常用数据库分析工具的使用方法,以后再专门介绍。

索引优化、Sql查询语句优化的更多相关文章

  1. sql查询语句优化

    http://www.cnblogs.com/dubing/archive/2011/12/09/2278090.html 最近公司来一个非常虎的dba  10几年的经验 这里就称之为蔡老师吧 在征得 ...

  2. SQL查询语句优化的实用方法

    查询语句的优化是SQL效率优化的一个方式,可以通过优化sql语句来尽量使用已有的索引,避免全表扫描,从而提高查询效率.最近在对项目中的一些sql进行优化,总结整理了一些方法. 1.在表中建立索引,优先 ...

  3. Mysql常用30种SQL查询语句优化方法

    出处:http://www.antscode.com/article/12deee70111da0c4.html 1.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使 ...

  4. MySQL 常用30种SQL查询语句优化方法

    1.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描. 2.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉 ...

  5. Sql 查询语句优化

    sql查询很慢,很多时候并不是数据量大,而是sql语法使用不正确,本文讲述了基础语法使用,避免一些不必要的坑. explain select * from user;--查询执行时间 目录 Sql 优 ...

  6. sql查询语句优化需要注意的几点

    为了获得稳定的执行性能,SQL语句越简单越好.对复杂的SQL语句,要设法对之进行简化. 常见的简化规则如下:   1)不要有超过5个以上的表连接(JOIN) 2)考虑使用临时表或表变量存放中间结果. ...

  7. 深入MySQL(四):MySQL的SQL查询语句性能优化概述

    关于SQL查询语句的优化,有一些一般的优化步骤,本节就介绍一下通用的优化步骤. 一条查询语句是如何执行的 首先,我们如果要明白一条查询语句所运行的过程,这样我们才能针对过程去进行优化. 参考我之前画的 ...

  8. 优化SQL查询:如何写出高性能SQL语句

    1. 首先要搞明白什么叫执行计划? 执行计划是数据库根据SQL语句和相关表的统计信息作出的一个查询方案,这个方案是由查询优化器自动分析产生的,比如一条SQL语句如果用来从一个 10万条记录的表中查1条 ...

  9. 浅谈SQL优化入门:1、SQL查询语句的执行顺序

    1.SQL查询语句的执行顺序 (7) SELECT (8) DISTINCT <select_list> (1) FROM <left_table> (3) <join_ ...

随机推荐

  1. python 绘图介绍

    1. python 绘图介绍 2. 函数 import numpy as np import matplotlib.pyplot as plt t = np.arange(0.0, 3.0, 0.01 ...

  2. 7. 堪比JMeter的.Net压测工具 - Crank 总结篇 - crank带来了什么

    目录 堪比JMeter的.Net压测工具 - Crank 入门篇 堪比JMeter的.Net压测工具 - Crank 进阶篇 - 认识yml 堪比JMeter的.Net压测工具 - Crank 进阶篇 ...

  3. Caffeine缓存详解

    概要 Caffeine是一个高性能,高命中率,低内存占用,near optimal 的本地缓存,简单来说它是 Guava Cache 的优化加强版,有些文章把 Caffeine 称为"新一代 ...

  4. 6月6日 python复习 面向对象

    1.面向对象编程 1.面向过程编程核心是"过程"二字,过程指的是解决问题的步骤,即先干什么再干什么基于该思想编写程序就好比在编写一条流水线,是一种机械式的思维方式 优点:复杂的问题 ...

  5. Python执行机制

    1.4 Python执行机制 Python中IDLE是其自带的集成开发工具(IDE:同时拥有编辑.编译.调试.运行等多种功能的集成工具),并且它也是Python自带的编译器和解释器. 1.4.1 Py ...

  6. dfs:x+y=z

    #include <iostream.h> int a[100]; static int stat=0; void dfs(int n) { if(n==3) { if(a[0]+a[1] ...

  7. Java如何跳出当前的多重嵌套循环?

    在Java中,要想跳出多重循环,可以在外面的循环语句前定义一个标号,然后在里层循环体的代码中使用带有标号的break 语句,即可跳出外层循环.例如, outer: for(int i=0;i<1 ...

  8. 什么是MVC模式?   

    MVC (Model View Controller) 是一个设计模式,使用MVC应用程序被分成三个核心部件:模型.视图.控制器.它们各自处理自己的任务.M是指数据模型,V是指用户界面,C则是控制器. ...

  9. producer内存管理分析

    1 概述 kafka producer调用RecordAccumulator#append来将消息存到本地内存.消息以TopicPartition为key分组存放,每个TopicPartition对应 ...

  10. 杭电OJ 1248 不死族巫妖王 完全背包问题 字节跳动 研发岗编程原题

    转载至:https://blog.csdn.net/ssdut_209/article/details/51557776 Problem Description不死族的巫妖王发工资拉,死亡骑士拿到一张 ...