性能分析

慢查询日志分析

①查询慢查询日志的状态

show global variables like '%slow_query_log%';

②开启慢查询日志(当mysql重启时会重置)

set global slow_query_log;

③查询mysql默认限制慢sql语句的上限时间值

show variables like '%long_query_time%';	# 默认10s

④设置long_query_time的值

set global long_query_time=3;	# 推荐使用config而不是这条命令

⑤显示慢sql的条数

show global status like '%Slow_queries%';
分析慢查询日志的工具

mysqldumpslow

explain查看执行计划

之前好像讲过了。

profile性能分析

①查询当前的profile状态

show variables like 'profiling';

②打开此功能

set profiling=on;

③查询所有sql执行的耗时时间

show profiles;	# 这里会有sql编号

④显示具体那一条的sql语句的具体状态(sql语句执行的生命周期)

show profile [all|cpu,block io] for query sql编号;

如果在状态中出现converting HEAP to MyISAM或Creating tmp table或Copying to tmp table to disk或locked这四个字段其中的一个或一个以上,说明此sql出现问题的原因。

性能优化

服务器层面优化

innodb_buffer_pool_size设置

调优参考计算方法:

val = Innodb_buffer_pool_pages_data / Innodb_buffer_pool_pages_total * 100%

val > 95% 则考虑增大 innodb_buffer_pool_size, 建议使用物理内存的75%

val < 95% 则考虑减小 innodb_buffer_pool_size, 建议设置为:Innodb_buffer_pool_pages_data * Innodb_page_size * 1.05 / (1024 * 1024 * 1024)

设置命令:

set global innodb_buffer_pool_size = 2097152; //缓冲池字节大小,单位kb,如果不设置,默认为128M

设置要根据自己的实际情况来设置,并不是设置越大越好,可能设置的数值太大体现不出优化效果,反而造成系统的swap空间被占用,导致操作系统变慢,降低sql查询性能。

内存预热

默认情况,只有某条数据被读取一次,才会缓存在 innodb_buffer_pool。所以,数据库刚刚启动,需要进行数据预热,将磁盘上的所有数据缓存到内存中。数据预热可以提高读取速度。

innodb_log_file_size设置

推荐 innodb_log_file_size 设置为 0.25 * innodb_buffer_pool_size

选择SSD磁盘提高读写能力

SQL设计层面优化

中间表的设计
冗余字段的设计
拆表字段

把常用字段放在主表,不常用字段放在子表,两张表一对一关联。

拆表数据(分库分表)

拆分数据源,可分为拆库和拆表。

拆库的要求是所有数据可通过某一个唯一标识聚合到一起。而这种拆分方式,分为两种:hash拆分冷热隔离

hash拆分

比如某个库是用来存储用户多维度信息的,可通过用户id聚合到一起,这种库的特点是多表有共同的聚合id字段。

这种方式的拆库,需要同时操作多个库,比如mod 10取值,那需要同时操作10个库,每个库的链接请求都是同量的,同时跨库操作也是十分麻烦的,事务就不用说了,维护成本也是成倍增加的。

优点是风险分散,某一个库挂了,其他库不受影响,整体服务受影响的比例也会降低。

冷热隔离

冷热隔离,是指把冷热数据区分开,这种隔离是基于数据访问的时效性,比如新闻资讯,越近的数据被访问概率越大。冷热的区分期间,或以时间来分割,或以id来分割。这种隔离的特点是,一core多non-core,重点维护core数据,而non-core随着时间推移,越早的数据被访问的概率越小,甚至可被直接归档。这样维护的数据会是极少的几个数据库。

SQL语句优化

limit优化
  1. 延迟加载(分页)
  2. select id from test where id = 最大id limit 10;
  3. 做索引:对于有where条件,又想走索引用limit的,必须设计一个索引,将where放第一位,limit用到的主键放第2位,而且只能select主键。
索引优化
如何创建索引并正确使用索引组合

联合索引优化策略:(选择索引列的顺序)

  1. 经常会被使用到的列优先
  2. 选择性高的列优先
  3. 宽度小的列优先
order by group by与索引设计的联系

order by在两种情况下满足Using Index排序:

  1. 最左前缀法则,使用的复合索引为最左前列;
  2. 使用的where子句与order by子句条件组合满足索引最左前列;

group by与order by遵循的原则基本一致。除了:能在where限定的条件就不要在having中限定。

当无法使用索引列时,group by与order by需要增加max_length_for_sort_data与sort_buffer_size参数设置。(因为单路与双路排序的原因:当数据量大且多单路排序一次完不成时,就会再次执行,最终将结果合并,这样可能导致,两路以上的排序。过多的路排序导致IO流操作频繁)

其他优化项
  1. join语句优化:尽可能减少Join语句中的内循环次数,"永远是小结果集驱动大的结果集";保证Join语句中的被驱动表上join条件字段已经被索引;
  2. 最左前缀法则
  3. 范围条件(range)右边的所有条件全失效。
  4. 使用<、<=、>、>=等条件操作导致全表扫描失效。
  5. 一般最好写like查询的条件是"字符串%",而"%字符串%"与"%字符串"这两种形式是会导致索引失效。用“覆盖索引:建立的索引与查询的字段最好查询个数与顺序上最好完全一致”解决;
  6. 查询条件varchar类型的字符串不加单引号会导致索引失效。
  7. 少用or,用它来链接查询的是否也会导致索引失效。
  8. 索引列上无计算操作,不然也会到索引失效。

mysql(4):性能分析和性能优化的更多相关文章

  1. MYSQL进阶学习笔记十一:MySQL 表的分析,检查和优化!(视频序号:进阶_28)

    知识点十二:MySQL 表的分析,检查和优化(28) 表的分析,检查和优化: 定期分析表: ANALYZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, ...

  2. MySQL高级篇 | 分析sql性能

    在应用的的开发过程中,由于初期数据量小,开发人员写 SQL 语句时更重视功能上的实现,但是当应用系统正式上线后,随着生产数据量的急剧增长,很多 SQL 语句开始逐渐显露出性能问题,对生产的影响也越来越 ...

  3. CSS性能分析,如何优化CSS提高性能

    不负十年后的自己,共勉! 前端性能优化一直是一个比较热门的话题,我们总是在尽我们最大的努力去,提高我们的页面性能,比如减少HTTP请求,利用工具对资源进行合并压缩,脚本置底,避免重复请求,css sp ...

  4. MySQL优化 - 性能分析与查询优化(转)

    出处:  MySQL优化 - 性能分析与查询优化 优化应贯穿整个产品开发周期中,比如编写复杂SQL时查看执行计划,安装MySQL服务器时尽量合理配置(见过太多完全使用默认配置安装的情况),根据应用负载 ...

  5. 高性能Linux服务器 第10章 基于Linux服务器的性能分析与优化

    高性能Linux服务器 第10章    基于Linux服务器的性能分析与优化 作为一名Linux系统管理员,最主要的工作是优化系统配置,使应用在系统上以最优的状态运行.但硬件问题.软件问题.网络环境等 ...

  6. 带你玩转Visual Studio——性能分析与优化

    找到性能瓶颈 二八法则适合很多事物:最重要的只占其中一小部分,约20%,其余80%的尽管是多数,却是次要的.在程序代码中也是一样,决定应用性能的就那20%的代码(甚至更少).因此优化实践中,我们将精力 ...

  7. 前端性能优化之利用 Chrome Dev Tools 进行页面性能分析

    背景 我们经常使用 Chrome Dev Tools 来开发调试,但是很少知道怎么利用它来分析页面性能,这篇文章,我将详细说明怎样利用 Chrome Dev Tools 进行页面性能分析及性能报告数据 ...

  8. PHP 性能分析第一篇: Xhprof & Xhgui 介绍

    [前言]这是国外知名博主 Davey Shafik所撰写的 PHP 应用性能分析系列的第一篇,阅读第二篇可深入了解 xhgui,第三篇则关注于性能调优实践. 什么是性能分析? 性能分析是衡量应用程序在 ...

  9. PHP 性能分析第一篇: Intro to Xhprof & Xhgui

    [前言]这是国外知名博主 Davey Shafik所撰写的 PHP 应用性能分析系列的第一篇,阅读第二篇可深入了解 xhgui,第三篇则关注于性能调优实践. 原文链接如下: https://blog. ...

随机推荐

  1. React.js高阶函数的定义与使用

    /* 高阶函数的简单定义与使用 一: 先定义一个普通组件 二: 用function higherOrder(WrappendComponent) { return } 将组件包裹起来,并用export ...

  2. es6简单小复习

    Ecmascript 6 ECMAScript 6.0(以下简称ES6)是JavaScript语言的下一代标准,已经在2015年6月正式发布了. Ecmascript 是 JavaScript 语言的 ...

  3. TamperMonkey 使用指南以及脚本推荐

    写在前面 Chrome浏览器是最适合开发者使用的浏览器,不仅仅是因为Chrome对于Js的友好支持,更是由于Chrome支持丰富且功能强大的插件,扩展了浏览器的功能和使用体验. 在这些插件里面,相信你 ...

  4. gulp常用插件之gulp-sourcemaps使用

    更多gulp常用插件使用请访问:gulp常用插件汇总 gulp-sourcemaps这是一款用来生成映射文件的一个插件,SourceMap 文件记录了一个存储源代码与编译代码对应位置映射的信息文件.我 ...

  5. PP: Articial Intelligence—TheRevolution Hasn’t HappenedYet

    From Michael I. Jordan As with many phrases that cross over from technical academic fields into gene ...

  6. 替换 MyEclipse 中已有的项目

    一.删除 tomcat 中的项目 1.停止 tomcat 2.删除 tomcat 中的项目 选中项目,然后右键 - Remove deployment,这个可能需要一点时间 二.删除 MyEclips ...

  7. HW - VCN 介绍

    VCN 是个管理摄像机的平台 用来增删改查摄像机,获取摄像机视频流,获取录像 vcn会基于我们的接口做一次开发,作为相机的统一管理入口,获取相机的信息

  8. ELK学习实验015:日志的自定义index配置

    前面使用json格式收集了nginx的日志,但是再index的显示是filebeat-*,现在使用自定义的index进行配置 但是再使用filebeat的7.4版本以后,有一个巨坑,就是按照网络的很多 ...

  9. tomcat-embeded-core源码编译

    使用spring-boot创建web工程时,默认采用embeded tomcat作为容器,实际使用过程中,可能会需要对其中的某些功能做微调,而tomcat又没有给出预留配 ,这时就需要对tomcat- ...

  10. jQuery---width和height的方法

    width和height的方法 //获取div的宽度 $("div").css("width", "400px"); console.log ...