索引优化、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_ ...
随机推荐
- git commit 后,没有push ,怎么撤销
如果是撤销到commit 之前,本地修改也放弃,可以 使用git reset --hard , 但是想保留本地修改,也想撤销commit 可以使用 git reset --mixed HEAD^ ...
- 七天接手react项目 系列 —— react 脚手架创建项目
其他章节请看: 七天接手react项目 系列 react 脚手架创建项目 前面我们一直通过 script 的方式学习 react 基础知识,而真实项目通常是基于脚手架进行开发. 本篇首先通过 reac ...
- turtle海龟库
•turtle的使用 #设置窗体大小 startx,starty非必需,默认在屏幕中间 turtle.setup(width,height,startx,starty) #海龟到(x,y)坐标 tur ...
- 解决使用DBeaver连接MySQL时报错-The server time zone value '�й���ʱ��' is unrecognized or represents more than one time zone.
解决使用DBeaver连接MySQL时报错,其实提示很明显. The server time zone value '�й���ʱ��' is unrecognized or represents ...
- 什么是unzip 命令?
· 解压 *.zip 文件:unzip test.zip . · 查看 *.zip 文件的内容:unzip -l jasper.zip .
- 【转】pringMVC+Hibernate+Spring 简单的一个整合实例
ref:http://langgufu.iteye.com/blog/2088355 SpringMVC又一个漂亮的web框架,他与Struts2并驾齐驱,Struts出世早而占据了一定优势,我在博客 ...
- String 和 StringBuilder、StringBuffer 的区别?
Java 平台提供了两种类型的字符串:String 和 StringBuffer/StringBuilder,它 们可以储存和操作字符串.其中 String 是只读字符串,也就意味着 String 引 ...
- CI_CD 简单了解
- Linux的权限总结
一般权限和特殊权限可控制 文件所有者.所有组.其他人的读写执行权限, 而隐藏权限则可以进行补充权限,可限制 文件内容只能追加内容,不更新属性等信息 ACL则可以进行让某个用户或组或other拥有指定文 ...
- Java 中的 TreeMap 是采用什么树实现的?
Java 中的 TreeMap 是使用红黑树实现的.