sql语句性能优化
需要的准备知识
1最左前缀匹配
mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配,
对于where条件
a = 1 and b> 2 and c = 3
如果我们建立(a,b,c)顺序的索引,
那么c 是用不到索引的,如果建立(a,c,b)的索引则都可以用到,a,c的顺序可以任意调整。
当我们建立(a,b)的复合索引
对于where条件
a = 1 依然是可以用到索引的。
注意:
=和in可以乱序,比如a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意顺序,
mysql的查询优化器会帮你优化成索引可以识别的形式
2 sql索引原则
2.1索引列的区分度尽量要高,区分度的计算公式count(distinct col)/count(*)
唯一键的区分度是1,而比如类似 状态,性别等字段在大数据面前区分度是0
2.2要保持索引列的值的干净,不能参与计算
比如 假如用户年龄上有索引
Select id from user where age>2 (会走索引)
Select id from user where age-2>0 (不会走索引)
2.3尽量的扩展索引,不要新建索引。比如表中已经有a的索引,现在要加(a,b)的索引
修改即可。
3优化神器 explain / desc 的使用
在你原来的sql语句之前加上 explain 就可以查看mysql对于该语句的执行计划
如下图所示
type
const(常量连接),比如SELECT * FROM user WHERE id=1;
eq_ref(等值引用),比如SELECT * FROM user,card WHERE user.id=card.userid;
ref(引用),用于非唯一索引,比如SELECT * FROM user,card WHERE user.last_name='test';
range(范围),比如SELECT * FROM tbl_name WHERE key_column > 10;
unique_subquery 子查询 针对唯一索引或者主键
index_subquery 子查询 针对非唯一索引列
index(索引),根据索引来读取数据,如果索引已包含了查询数据,只需扫描索引树,否则执行全表扫描和All类似;
ALL(所有),全表扫描
Extra
Using index:表示使用索引,如果同时出现Using where,代表使用索引来查找读取记录,如果没有Using where,表示索引包含查询数据,无需额外的查找;
Using where:表示条件查询,如果type列是ALL或index,而没有出现该信息,则你有可能在执行错误的查询:返回所有数据;
Using filesort:不是“使用文件索引”的含义!filesort是MySQL所实现的一种排序策略,通常在使用到排序语句ORDER BY的时候,会出现该信息; [非索引字段排序]
Using temporary:表示为了得到结果,使用了临时表,这通常是出现在多表联合查询,结果排序的场合。
我们需要重点关注rows。
优化方法(步骤)
1.先运行看看是否真的很慢,注意看是否设置了SQL_NO_CACHE。优化之前先关闭。
2.explain查看执行计划,看那些地方比较慢
3.order by limit 形式的sql语句让排序的表优先查(也就是遇到这类情况,我们可以先去掉order by limit 看是不是他导致的)
4.加索引时参照上面的sql索引原则
5.观察结果,不符合预期继续从1分析
sql语句性能优化的更多相关文章
- Oracle SQL语句性能优化方法大全
Oracle SQL语句性能优化方法大全 下面列举一些工作中常常会碰到的Oracle的SQL语句优化方法: 1.SQL语句尽量用大写的: 因为oracle总是先解析SQL语句,把小写的字母转换成大写的 ...
- 52 条 SQL 语句性能优化策略,建议收藏
本文会提到 52 条 SQL 语句性能优化策略. 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在where及order by涉及的列上建立索引. 2.应尽量避免在where子句中对字段进行nul ...
- Oracle数据库的sql语句性能优化
在应用系统开发初期,由于开发数据库数据比较少,对于查询sql语句,复杂试图的编写等体会不出sql语句各种写法的性能优劣,但是如果将应用系统提交实际应用后,随着数据库中数据的增加,系统的响应速度就成为目 ...
- 数据库SQL语句性能优化
选择最有效率的表名顺序 ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下 ...
- Oracle之SQL语句性能优化(34条优化方法)
(1)选择最有效率的表名顺序(只在基于规则的优化器中有效): ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处 ...
- Mysql性能优化一:SQL语句性能优化
这里总结了52条对sql的查询优化,下面详细来看看,希望能帮助到你 1, 对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2,应尽量避免在 w ...
- Mysql 52条SQL语句性能优化策略汇总
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在where及order by涉及的列上建立索引. 2.应尽量避免在where子句中对字段进行null值判断,创建表时NULL是默认值,但大多数时候应 ...
- SQL语句性能优化策略
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 WHERE 及 ORDER BY 涉及的列上建立索引.2.应尽量避免在 WHERE 子句中对字段进行 NULL 值判断,创建表时 NULL 是默认 ...
- SQL Server性能优化(6)查询语句建议
1. 如果对数据不是工业级的访问(允许脏读),在select里添加 with(nolock) ID FROM Measure_heat WITH (nolock) 2. 限制结果集的数据量,如使用TO ...
随机推荐
- python调用GDAL实现几何校正
引自https://blog.csdn.net/qq_27045589/article/details/81062586 def main(): infile = "F:\\Temp_Dat ...
- 嵌入式linux——时钟(三)
今天写第一篇,S3C2440的时钟,配置好时钟系统,各个模块才能正常有效的工作,为了了解始终系统,必须要阅读芯片手册,尽量看英文版的,这样还能捎带着增加一下阅读英语计数文档的能力. 概览 在2440数 ...
- springIoC的理解01
IOC将模块(对象)之间的依赖关系交由IOC容器管理,让应用开发对接口编程,而不是对类编程.依赖反转:每个对象都需要与其合作的对象(也就是依赖的对象)的引用.未使用依赖反转的特性之前,是需要先创建一个 ...
- 深度学习原理与框架- tf.nn.atrous_conv2d(空洞卷积) 问题:空洞卷积增加了卷积核的维度,为什么不直接使用7*7呢
空洞卷积, 从图中可以看出,对于一个3*3的卷积,可以通过使用增加卷积的空洞的个数,来获得较大的感受眼, 从第一幅图中可以看出3*3的卷积,可以通过补零的方式,变成7*7的感受眼,这里补零的个数为1, ...
- FI-盘盈盘亏借贷科目
资产的盘盈盘亏一般分两步:第一步,批准前调整为账实相符:第二步,批准后结转处理.库存现金.存货.固定资产.工程物资的盘盈盘亏的账务处理见下图: 以上科目中可能并不完整,比如“原材料等科目”就可能包括“ ...
- chrome浏览器 新建 标签 页面 跳转到主页(或跳转到谷歌)
我的浏览器是跳转到自己设置的主页.我在贴吧看到的以下方式,然后就可以了: 地址栏输入 chrome://flags 搜索 Enable doodles on the local NTP 这一项改为di ...
- Java连接kafka
1.maven依赖: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://ww ...
- 前端笔记-jquery
一.什么是jquery 1.jQuery由美国人John Resig创建,至今已吸引了来自世界各地的众多 javascript高手加入其team 2.jQuery是继prototype之后又一个优秀的 ...
- Lock和Static使用说明和区别
private static object lockInsertObj = new object(); lock (lockInsertObj){--写代码} 1.静态方法与非静态方法 a.静态方法的 ...
- vs2015下编译duilib的几个问题
duilib下载地址在github 用vs2015打开,提示升级工程,确认后继续. 编译,UIGifAnim.cpp 323行报错 1>Control\UIGifAnim.cpp(324): e ...