高性能Mysql笔记 — 优化
性能优化
了解查询的整个生命周期,清楚每个阶段的时间消耗情况
性能分析
慢查询日志——服务器性能分析
参考
慢查询日志是优化很重要的手段,但是开启慢查询日志对性能的影响并不大,所以可以考虑在线上打开慢查询日志
- 查看慢查询是否打开、以及日志存储位置:show variables like '%slow%'
统计当前数据库连接状态
mysql -e 'show processlist \G' -uroot -proot | grep State | sort | uniq -c | sort -rn
剖析单条查询
select @@profiling:查看profiling是否打开
set profiling=1:打开profiling
show profiles:查看每条查询的性能
show profile for query id:查看query id的详细时间花费
information_schema.profiling:该表存储了每个query的详细时间花费
show status:查看会话级别的计数器
show global status:查看全局的计数器
show status where variable_name like '%handler%':查看某些变量的计数
查询性能优化
查询由多个子任务组成,优化查询也就是优化子任务
- 消除一些子任务
- 减少子任务执行次数
- 让子任务执行更快
优化数据访问
不要请求不需要的数据
- 只返回必要的行(limit)、列(尽量不要使用星号返回所有列)
- 尽量不要查询重复的数据,使用缓存
是否在扫描额外的记录
mysql衡量查询开销的指标:
- 响应时间
- 扫描行数
- 返回的行数
访问类型
explain语句中的type指明了访问类型,包括:全表扫描,索引扫描,范围扫描,唯一索引查询,常数引用,从左到右扫描的行数从多到少,速度从慢到快
查询语句中where条件的使用,性能从好到坏是:
- 在索引中使用where条件过滤不匹配的记录,这是在存储引擎层完成的
- 使用覆盖引擎(extra中出现using index)来返回记录,直接从索引过滤不需要的记录并返回结果,在在服务器层完成,不需要回表
- 在表中返回数据,使用where过滤不匹配的记录(extra中出现using where),在服务层完成。mysql需要先读数据然后过滤
分解复杂查询
- 切分查询:将数据量大的查询切分为几次(有些情况分析查询的性能更好,比如删除数据,每次删除10条比一次删除100条来得好,当在数据库业务繁忙的时候)
- 分解关联查询:
- 缓存效率高:mysql中如果关联表发生了变化,缓存就失效了;而且应用程序可以缓存切分查询之后的结果
- 执行单个查询减少锁竞争
- 数据库表不做强关联,在应用层做,扩展性更好
mysql执行、优化查询的方式
mysql查询优化器的局限性
优化器只关心随机页面的读取
- 关联子查询:有时候可以使用join的方式重写关联子查询,效率更好
- union的限制:mysql不能将条件放入union各个查询中,重写的时候可以把共同的条件写入各个查询中
- 索引合并优化:mysql可以利用同一张表上的多个索引,explain的时候type为index_merge,key为使用到的索引。如果存在合并(and的情况)那么可以考虑将多个单列索引合为一个多列索引
- 等值传递
- 并行执行:
- 松散索引
- 哈希关联
- 最大值和最小值:mysql的min和max函数
- 在同一个表上查询和更新:mysql不允许同时对一张表查询和更新,可以使用join的方式来select需要在该表上查询的字段
干涉查询优化器
mysql提供了一些选项来干涉优化器的行为,但是建议一般情况下不要使用,因为一般干涉优化器带来的收效较小,反而给版本升级的时候带来一些问题
优化特定类型的查询
count
count(col):查询该列值得个数(不包含null)
count(星号):查询行数
- myisam全表count(星号)很快
- 对于不精确的统计使用缓存
优化关联查询
- 确保on和using列上有索引,A join B on col,那么一般只需要在B的col创建索引就够了
- 确保group by 和order by的表达式只涉及一个表中的列,mysql才可以使用索引来优化
优化子查询
使用关联查询代替子查询,在mysql5.6和mariadb不需要考虑
优化group by和order by
group by的结果默认会按照分组字段进行排序,如果不需要排序可以去掉排序,指定order by NULL
优化分页查询
当页码比较多的时候需要扫描的数据较大,这个时候可以使用覆盖索引进行优化,先使用索引覆盖查询出limit的分页数据,然后join该表,查询其他字段,这样就减少了扫描的行数
select * from user_order inner join (select order_id from user_order order by buy_date limit 50, 5) as lim on lim.order_id=user_order.order_id;
或者可以记下该分界行的标识列(该列最好有索引),比如主键id,然后查询基于该分界的记录
select * from user_order where order_id > 500 order by order_id limit 5;
对于总记录数,如果不那么精确的话可以使用explain的rows
优化union查询
除非有消除重复行的必要,否则使用union all,因为使用union会在临时表上加distinct,导致对整个临时表做唯一性校验
使用自定义变量
高性能Mysql笔记 — 优化的更多相关文章
- 高性能MySQL笔记 第6章 查询性能优化
6.1 为什么查询速度会慢 查询的生命周期大致可按照顺序来看:从客户端,到服务器,然后在服务器上进行解析,生成执行计划,执行,并返回结果给客户端.其中“执行”可以认为是整个生命周期中最重要的阶段. ...
- 高性能Mysql笔记 — explain
explain 查看sql的执行计划,只是一个近似结果,一般不会实际执行该sql,如果有子查询就会执行子查询 explain table_name,这儿的table_name含义较广:子查询.unio ...
- 高性能MySQL笔记 第4章 Schema与数据类型优化
4.1 选择优化的数据类型 通用原则 更小的通常更好 前提是要确保没有低估需要存储的值范围:因为它占用更少的磁盘.内存.CPU缓存,并且处理时需要的CPU周期也更少. 简单就好 简 ...
- 高性能MySQL笔记 第5章 创建高性能的索引
索引(index),在MySQL中也被叫做键(key),是存储引擎用于快速找到记录的一种数据结构.索引优化是对查询性能优化最有效的手段. 5.1 索引基础 索引的类型 索引是在存储引擎层而 ...
- 读高性能MySql笔记
1.1 MySQL逻辑架构 MySql服务器逻辑架构图 1.连接管理与安全性 每个客户端连接都会在服务器进程中拥有一个线程,这个连接的查询只会在这个单独的线程中执行,该线程只能轮流在某个CPU核心或者 ...
- 高性能Mysql笔记 — 索引
index优化 对于频繁作为查询条件的字段使用索引 注意索引字段类型的隐式转换,数据库类型和应用类型要一致 索引的种类 唯一索引,成为索引的列不能重复 单列索引,一个索引只包含一列 单列前缀索引,有些 ...
- 高性能MySQL笔记:第1章 MySQL架构
MySQL 最重要.最与众不同的特性是他的存储引擎架构,这种架构的设计将查询处理(Query Precessing)及其系统任务(Server Task)和数据的存储/提取相分离. 1.1 MyS ...
- 高性能MySQL笔记
锁粒度:表锁.行级锁 表锁锁定整张表 隔离级别: 未提交读:事务中的修改,即使没有提交,对其他事务也是可见的.事务可以读取未提交的数据,也被称为脏读.实际应用中比较少用 提交读:一个事务提交之前,所做 ...
- 高性能mysql笔记 第一章 mysql架构
1.1 mysql逻辑结构 第一层: 负责连接处理,授权认证,安全等事情 第二层:负责mysql的大部分核心功能 ,查询解析,分析,优化,缓存和所有的内置函数,所有跨存储引擎的功能都在这一层实现,, ...
随机推荐
- 通过TABULATE过程制作汇总报表
通过TABULATE过程制作汇总报表 制作基本汇总报表 TABULATE过程的基本语法如下: PROC TABULATE DATA=数据集 <选项>; CLASS 变量1 <变量2变 ...
- PAT DFS,BFS,Dijkstra 题号
为什么要分类刷题: 因为刷⼀道算法题需要花⼀两个⼩时甚⾄半天,平时我们还要上课做别的事情,你在⼀段时间内刷算法如果只按照顺序,可能今天遇到了⼀道最短路径的题⽬,弄了半天好不容易看懂了别⼈的代码,以为⾃ ...
- EC20指令测试
cat /dev/ttyUSB2 & echo -e "AT+CGMM\r\n" >/dev/ttyUSB2 //输出模块型号 echo -e "AT+ ...
- mixer中动态Alpha通道处理案例
本案例处理的是RGB+a,每个色彩的采样为10位位宽. 1.在Mixer IP中打开Alpha Blending Enable 和Alpha Input Stream Enable.这样在Blo ...
- Monkey测试结果分析
Monkey测试结果分析 什么是monkey Monkey 测试是 Android 自动化测试的手段之一,它通过模拟用户的按键输入.触摸屏输入等,测试设备多长时间出现异常.Monkey 是一个命令行工 ...
- vue组件自定义属性命名
今天自己写vue组件demo的时候发现一个有趣的问题:vue组件自定义属性命名不支持用驼峰命名! 上面图示为正常情况下的自定义属性,没有任何问题. 但是一旦出现自定义属性中包含了大写字母,则如下图所示 ...
- Linux系统调用:进程的终止
之前总结了Linux的系统创建,主要是fork()函数和vfork()函数,最近总结了Linux进程的终止,主要的调用是_exit()和exit(). 先看看两个函数的原型以及各自属于的头文件,可以发 ...
- MacOS使用Charles抓去HTTPS数据
1.安装Charles,示例版本为4.0.1 2.Proxy->Proxy Settings 3.MacOS->Terminal->ifconfig 获取本机IP地址,如192.16 ...
- Hadoop集群及基本组件搭建
本人采用一个master和两个slave的网络结构,具体搭建如下 1.准备安装包 1.下载安装包 http://pan.baidu.com/s/1jIoZulw 2.安装包清单 scala-2.12. ...
- 《JavaScript 高级程序设计》读书笔记四 变量 作用域 内存
一 变量(基本类型和引用类型) a.基本类型保存值,保存在栈内存,引用类型保存指针,保存在堆内存: b.所有函数的参数都是按值进行传递的,不管参数是何种类型: c.检测类型 typeof ...