文档章节

数据库-->总结数据库查询调优

qrainly
 qrainly
发布于 07/17 15:38
字数 890
阅读 17
收藏 0

在我们平时的工作项目中,会经常性的跟数据库打交道,如何写出一条优雅有高效的sql脚本,提高我们业务查询的效率是我们每一个程序员都必须要考虑的问题。博主在上家公司接手了一个外派项目,光是做sql优化就已经搞死了我们多少小伙伴。之后的几次面试经历也发现,对于数据库调优确实非常的重要,于是找了时间查了一些网上提供的方案,以及博主个人实际项目的总结,最终给出以下几条调优建议。

Mysql调优总结

0、开启慢查询输出

指定慢查询的时间,将多余此时间的慢查询sql输出到log里 Show variables like 'long_query_time'; 显示慢查询时间 Set long_query_time=2; 设置慢查询时间

1、使用EXPLAN查看执行计划

关注type和key type:至少达到range级别,避免all key:索引名

2、能用between就不用了in

3、select 后面指明查询的字段名 禁止 * 会造成不必要的CPU/IO/内存/带宽

4、如果排序字段没有用到索引,就尽量少排序

5、如果限制条件中其他字段没有索引,尽量少用or,用union all或union代替

6、尽量用union all代替union

union和union all的差异主要是前者需要将结果集合并后再进行唯一性过滤操作,这就会涉及到排序, 增加大量的CPU运算,加大资源消耗及延迟。当然,union all的前提条件是两个结果集没有重复数据。

7、in和exists 、not in和not exists

in适合于外表大而内表小的情况
exists适合外表小内表大的情况 推荐使用not exists

8、分页查询建议先取上一页最大行数的ID来限制下一页的起点

9、避免在where子句中对字段进行值判断 会导致索引失效

10、不建议使用%前缀模糊查询 会导致索引失效

11、避免在where子句中对字段进行表达式操作 会导致索引失效

12、避免隐式类型转换

where子句中出现column字段的类型和传入的参数类型不一致的时候发生的类型转换,建议先确定where中的参数类型。

13、对于联合索引来说,要遵守最左前缀匹配规则

14、必要时可以使用force index来强制查询走某个索引

15、注意范围查询语句

对于联合索引来说,如果存在范围查询,比如between、>、<等条件时,会造成后面的索引字段失效。

16、关于JOIN优化

尽量使用inner join,避免left join 合理利用索引:被驱动表的索引字段作为on的限制字段 利用小表去驱动大表

17、高频率的字段加上索引,提高查询效率

18、根据业务需要做相关字段的冗余

持续更新中...

© 著作权归作者所有

qrainly
粉丝 1
博文 27
码字总数 25025
作品 0
顺义
程序员
私信 提问
MySQL · 特性分析 · Statement Digest

背景 在对数据库进行性能调优的时候,除了参数、配置的调整以外,SQL调优也是重要的手段,同时也是收益最大的一环。 当DBA对业务库进行sql调优的时候,如何做到有的放矢,投入产出受益最大?...

阿里云RDS-数据库内核组
2015/11/03
0
0
加速你的Hibernate引擎(上)

1.引言 Hibernate是最流行的对象关系映射(ORM)引擎之一,它提供了数据持久化和查询服务。 在你的项目中引入Hibernate并让它跑起来是很容易的。但是,要让它跑得好却是需要很多时间和经验的...

红薯
2010/11/03
937
1
Hibernate与MyBatis的对比总结

第一章 Hibernate与MyBatis Hibernate 是当前最流行的O/Rmapping框架,它出身于sf.net,现在已经成为Jboss的一部分。 Mybatis 是另外一种优秀的O/Rmapping框架。目前属于apache的一个子项目。...

爪哇程序猿
2015/09/23
167
0
【每日一摩斯】-Troubleshooting: High CPU Utilization (164768.1) - 系列6

如果问题是一个正运行的缓慢的查询SQL,那么就应该对该查询进行调优,避免它耗费过高的CPU资源。如果它做了许多的hash连接和全表扫描,那么就应该添加索引以提高效率。 下面的文章可以帮助判...

bisal
2013/09/11
0
0
Hibernate与 MyBatis的比较

最近做了一个Hibernate与MyBatis的对比总结,希望大家指出不对之处。 第一章 Hibernate与MyBatis Hibernate 是当前最流行的O/R mapping框架,它出身于sf.net,现在已经成为Jboss的一部分。 ...

jiyayun
2012/11/15
1K
2

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周六乱弹 —— 早上儿子问我他是怎么来的

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @凉小生 :#今日歌曲推荐# 少点戾气,愿你和这个世界温柔以待。中岛美嘉的单曲《僕が死のうと思ったのは (曾经我也想过一了百了)》 《僕が死の...

小小编辑
今天
1K
12
Excption与Error包结构,OOM 你遇到过哪些情况,SOF 你遇到过哪些情况

Throwable 是 Java 中所有错误与异常的超类,Throwable 包含两个子类,Error 与 Exception 。用于指示发生了异常情况。 Java 抛出的 Throwable 可以分成三种类型。 被检查异常(checked Exc...

Garphy
今天
16
0
计算机实现原理专题--二进制减法器(二)

在计算机实现原理专题--二进制减法器(一)中说明了基本原理,现准备说明如何来实现。 首先第一步255-b运算相当于对b进行按位取反,因此可将8个非门组成如下图的形式: 由于每次做减法时,我...

FAT_mt
昨天
6
0
好程序员大数据学习路线分享函数+map映射+元祖

好程序员大数据学习路线分享函数+map映射+元祖,大数据各个平台上的语言实现 hadoop 由java实现,2003年至今,三大块:数据处理,数据存储,数据计算 存储: hbase --> 数据成表 处理: hive --> 数...

好程序员官方
昨天
7
0
tabel 中含有复选框的列 数据理解

1、el-ui中实现某一列为复选框 实现多选非常简单: 手动添加一个el-table-column,设type属性为selction即可; 2、@selection-change事件:选项发生勾选状态变化时触发该事件 <el-table @sel...

everthing
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部