索引优化、Sql查询语句优化
工作中我们经常会遇到系统查询慢的情况,一般我们会采取好多方法进行优化,如建立索引,优化查询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查询语句优化的更多相关文章
- sql查询语句优化
http://www.cnblogs.com/dubing/archive/2011/12/09/2278090.html 最近公司来一个非常虎的dba 10几年的经验 这里就称之为蔡老师吧 在征得 ...
- SQL查询语句优化的实用方法
查询语句的优化是SQL效率优化的一个方式,可以通过优化sql语句来尽量使用已有的索引,避免全表扫描,从而提高查询效率.最近在对项目中的一些sql进行优化,总结整理了一些方法. 1.在表中建立索引,优先 ...
- Mysql常用30种SQL查询语句优化方法
出处:http://www.antscode.com/article/12deee70111da0c4.html 1.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使 ...
- MySQL 常用30种SQL查询语句优化方法
1.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描. 2.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉 ...
- Sql 查询语句优化
sql查询很慢,很多时候并不是数据量大,而是sql语法使用不正确,本文讲述了基础语法使用,避免一些不必要的坑. explain select * from user;--查询执行时间 目录 Sql 优 ...
- sql查询语句优化需要注意的几点
为了获得稳定的执行性能,SQL语句越简单越好.对复杂的SQL语句,要设法对之进行简化. 常见的简化规则如下: 1)不要有超过5个以上的表连接(JOIN) 2)考虑使用临时表或表变量存放中间结果. ...
- 深入MySQL(四):MySQL的SQL查询语句性能优化概述
关于SQL查询语句的优化,有一些一般的优化步骤,本节就介绍一下通用的优化步骤. 一条查询语句是如何执行的 首先,我们如果要明白一条查询语句所运行的过程,这样我们才能针对过程去进行优化. 参考我之前画的 ...
- 优化SQL查询:如何写出高性能SQL语句
1. 首先要搞明白什么叫执行计划? 执行计划是数据库根据SQL语句和相关表的统计信息作出的一个查询方案,这个方案是由查询优化器自动分析产生的,比如一条SQL语句如果用来从一个 10万条记录的表中查1条 ...
- 浅谈SQL优化入门:1、SQL查询语句的执行顺序
1.SQL查询语句的执行顺序 (7) SELECT (8) DISTINCT <select_list> (1) FROM <left_table> (3) <join_ ...
随机推荐
- 一比一还原axios源码(八)—— 其他功能
到此,我们完成了axios的绝大部分的功能,接下来我们来补全一下其他的小功能. 一.withCredentials 这个参数可以可以表明是否是一个跨域的请求.那这个的使用场景是啥呢?就是我们在同域的 ...
- vue2.x版本中computed和watch的使用入门详解-computed篇
前言 在基于vue框架的前端项目开发过程中,只要涉及到稍微复杂一点的业务,我们都会用到computed计算属性这个钩子函数,可以用于一些状态的结合处理和缓存的操作. 基础使用 在computed中,声 ...
- Linux 查询文件内容重复数 uniq、sort命令
前提:uniq只能查询数据相邻的重复次数,而sort可以查询乱序的重复次数. 原谅我,以下内容都是复制菜鸟驿站的!!! Linux uniq 命令用于检查及删除文本文件中重复出现的行列,一般与 sor ...
- ZYNQ 驱动初始化套路--UART串口
@ 目录 UART 串口 GPIO之 MIO控制 LED 套路如下: 1.定义硬件信息结构体 namePs_Config *Config; 2.定义驱动信息结构体 namePs name_Ps; 3. ...
- SWAKS伪造邮件发送
一.SWAKS介绍 swaks(SWiss Army Knife Smtp)SMTP瑞士军刀Swaks是由John Jetmore编写和维护的一种功能强大,灵活,可脚本化,面向事务的SMTP测试工具. ...
- C# XML基础入门(XML文件内容增删改查清)
前言: 最近对接了一个第三方的项目,该项目的数据传输格式是XML.由于工作多年只有之前在医疗行业的时候有接触过少量数据格式是XML的接口,之后就几乎没有接触过了.因此对于XML这块自己感觉还是有很多盲 ...
- seqlist template
1 #include <iostream.h> 2 typedef int ElemType; 3 typedef struct{ 4 ElemType *elem; 5 int leng ...
- ClassLoader如何加载class ?
jvm里有多个类加载,每个类加载可以负责加载特定位置的类,例如,bootstrap类加载负责加载jre/lib/rt.jar中的类, 我们平时用的jdk中的类都位于rt.jar中.extclasslo ...
- Python - random库介绍
- Linux内核, 编译一个自己的内核
本文,我们将一步一步地介绍如何从源代码编译和安装一个Linux内核.需要注意的是本指导基于Ubuntu 20.04版本编译安装,其它发行版可能会有差异. 在前面文章中我们反复提到过Linux内核, ...