索引优化、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_ ...
随机推荐
- matlab语法基础(处理一点数据)
1.声明函数,返回参数data,函数名为simutrack function data=simutrack(x0,y0) 2.%用于标注,注释 3.平方 ^2 4.二维零矩阵 [0 0;0 0] 5. ...
- 在kali中安装两个版本的python
在kali中安装两个版本的python 在kali中已经预装了两个版本的python,但是没有装pip(>︿<). 这时使用python或者python3表示python3:使用pytho ...
- Linux-timedatectl使用
Linux下使用timedatectl命令时间时区操作详解 timedatectl命令对于RHEL / CentOS 7和基于Fedora 21+的分布式系统来说,是一个新工具,它作为systemd系 ...
- springcloud学习03-spring cloud eureka(上)
对eureka一个大概介绍:https://blog.csdn.net/u010623927/article/details/88762525 这里面有个我做dubbo时的一个理解的错误:服务注册中不 ...
- 接口(interface)与抽象类(abstract class)两者的异同
首先说明一下,JDK1.8以后接口可以有默认方法和静态方法以及私有方法. 一.概念: 接口(interface):是抽象类的变体,其中所有的方法都是抽象的且不能有方法体,而且只能定义 static f ...
- 一个关于wait/notify与锁关系的探究
wait/notify 机制是解决生产者消费者问题的良药.它的核心逻辑是基于条件变量的锁机制处理.所以,它们到底是什么关系?wait()时是否需要持有锁? notify()是否需要持有锁?先说答案:都 ...
- 从查询重写角度理解elasticsearch的高亮原理
一.高亮的一些问题 elasticsearch提供了三种高亮方式,前面我们已经简单的了解了elasticsearch的高亮原理; 高亮处理跟实际使用查询类型有十分紧密的关系,其中主要的一点就是muti ...
- Dubbo SPI 和 Java SPI 区别?
JDK SPI JDK 标准的 SPI 会一次性加载所有的扩展实现,如果有的扩展吃实话很耗时,但 也没用上,很浪费资源. 所以只希望加载某个的实现,就不现实了 DUBBO SPI 1,对 Dubbo ...
- python 元组tuple 增删改查操作
初始化: data_tuple = () data_tuple1 = (1,) data_tuple2 = tuple() 新增: data_tuple+data_tuple1 (data_tuple ...
- BeanFactory – BeanFactory 实现举例?
Bean 工厂是工厂模式的一个实现,提供了控制反转功能,用来把应用的配置和依赖从正真的应用代码中分离. 最常用的BeanFactory 实现是XmlBeanFactory 类.