MySQL之性能剖析(一)

MySQL之架构设计与历史

转换表的引擎

  • 1.ALTER TABLE
    将表从一个引擎修改为另一个引擎最简单的办法是使用ALTER TABLE语句。下面的语句将mytable的引擎修改为InnoDB:
mysql>ALTER TABLE mytable ENGINE = InnoDB;

上述语法可以使用任何存储引擎。但有一个问题:需要执行很长时间。MySQL会按行将数据从原表复制到一张新的表中,在复制期间可能会消耗系统所有的I/O能力,同时原表上回加上读锁。所以,在繁忙的表上执行此操作要特别小心。一个替代方案是采用导入与导出的方法,手工进行表的复制。如果转换表的存储引擎,将会失去和原引擎相关的所有特性。例如,将一张InnoDB表转换为MyISAM,然后再转换回InnoDB,原InnoDB表上所有的外键将丢失。

  • 2.导出与导入
    为了更好地控制转换的过程,可以使用mysqldump工具将数据导出到文件,然后修改文件中CREATE TABLE语句的存储引擎选项,注意同时修改表名,因为同一个数据库中不能存在相同的表ing,即使它们使用的是不同的存储引擎。同时要注意mysqldump默认回自动再CREATE TABLE语句前加上DROP TABLE语句,不注意这一点可能回导致数据丢失.
  • 3.创建与查询(CREATE 和SELECT)
    第三种转换的技术综合了第一种方法的高效和第二种方法的安全。不需要导出整个表的数据,而是先创建一个新的存储引擎的表,然后利用INSERT…SELECT语法来导数据:
mysql>START TRANSACTION;
mysql>INSERT INTO innodb_table SELECT * FROM myisam_table WHERE id BETWEEN x AND y;
mysql>COMMIT;

这样操作完成以后,新表是原表的一个全量复制,原表还在,如果需要可以删除原表。如果有必要,可以在执行的过程中对原表加锁,以确保新表和原表的数据一致。

服务器性能剖析

概述

最常碰到的三个性能相关的服务请求是:如何确认服务器是否达到了性能最佳的状态、找出某条语句为什么执行不够快、诊断被人们描述成"停顿"、“堆积"或者"卡死"的某些间歇性疑难故障。
问10个人关于性能的问题,可能会得到10个不同的回答,比如"每秒查询次数”、“CPU利用率”、"可扩展性"之类。这其实也没有什么问题,每个人在不同场景下对性能有不同的理解,但是比较正式的定义是完成某件任务所需要的时间度量,换句话说,性能即响应时间,这是一个非常重要的原则。通过任务和时间而不是资源来测试性能。数据库服务器的目的是执行SQL语句,所以它关注的任务是查询或者语句,如SEELCT、UPDATE、DELETE等。数据库服务器的性能用查询的响应时间来度量,单位是每个查询花费的时间。

还有另外一个问题:什么是优化?暂时不讨论这个问题,而是假设性能优化就是在一定的工作负载下尽可能地降低响应时间。很多人对此很迷茫。假如你认为性能优化是降低CPU利用率,那么可以减少对资源的使用。但这是一个陷阱,资源是用来消耗并用来工作的,所以有时候消耗更多的资源能够加快查询速度。很多时候使用老版本InnoDB引擎的MySQL升级到新版本后,CPU利用率会上升得很厉害,这并不代表性能出现了问题,反而说明新版本得InnoDB对资源的利用率上升了。查询的响应时间则更能体现升级后的性能是不是变得更好。版本升级有时候会带来一些bug,比如不能利用某些索引从而导致CPU利用率上升。CPU利用率只是一种现象,而不是很好的可度量的目标。

同样,如果把性能优化仅仅堪称是提升每秒查询量,这其实只是吞吐量优化。吞吐量的提升可以看作性能优化的副产品,对查询的优化可以让服务器每秒执行更多的查询,因为每条查询执行的时间更短了(吞吐量的定义是单位时间内的查询数量,这正好是前面对性能定义的倒数)。
所以如果目标是降低响应时间,那么就需要理解为什么服务器执行查询需要这么多时间,然后去减少或者消除哪些对获得查询结果来说不必要的工作。也就是说,先要搞清楚时间花在哪里。这就引申出优化的第二个原则:无法测量就无法有效地优化,所以第一步应该测量时间花在哪里
很多人在优化时,都将精力放在修改一些东西上,却很少去进行精确地测量。我们地做法完全相反,将花费非常多,甚至90%的时间来测量响应时间花在哪里。如果通过测量没有找到答案,那要么是测量的方式错了,要么是测量得不够完整。如果测量了系统中完整而且正确得数据,性能问题一般都能暴露出来,对症下要得解决方案也就比较明了。测量是一项很有挑战性的工作,并且分析结果也同样有挑战性,测出时间花在哪里,和知道为什么花在那里,是两码事。
前面提到需要合适的测量范围,其实合理的测量范围是说只测量需要优化的活动。有两种比较常见的情况会导致不合适的测量:

  • 1.在错误的时间启动和停止测量
  • 2.测量的是聚合后的信息,而不是目标互动本身。

例如,一个常见的错误是先看慢查询,然后又去排查整个服务器的情况来判断问题在那里。如果确认有慢查询,那么就应该测量慢查询,而不是测量整个服务器。测量的应该是从慢查询的开始到结束的时间,而不是查询之前或查询之后的时间。
完成一项任务所需要的时间可以分成两部分:执行时间和等待时间。如果要优化任务的执行时间,最好的办法是通过测量定位不同的子任务花费的时间,然后优化去掉一些子任务、降低子任务的执行频率或者提升子任务的效率。而优化任务的等待时间则相对要复杂一些,因为等待有可能是由其他系统间接影响导致,任务之间也可能由于争用磁盘或者CPU资源而相互影响。根据时间是花在执行还是等待上的不同,诊断也需要不同的工具和技术

对应用程序进行性能剖析

对任何需要消耗时间的任务都可以做性能pixie,当然也包括应用程序。实际上,剖析应用程序一般比剖析数据库服务器容易,而且回报更多。虽然前面都是针对MySQL服务器的剖析,但对系统进行性能剖析还是建议自上而下地进行,这样可以追踪自用户发起到服务器响应的整个流程。虽然性能问题大多数情况下都和数据库有关,但应用导致的性能问题也不少。性能瓶颈可能有很多影响因素:

  • 1.外部资源,比如调用了外部的Web服务或者搜索引擎
  • 2.应用需要处理大量的数据,比如分析一个超大的XML文件
  • 3.在循环中执行昂贵的操作,比如滥用正则表达式
  • 4.使用了低效的算法,比如使用暴力搜索算法(naive search algorithm)来查找列表中的项

幸运的是,确定MySQL的问题没有这么复杂,只需要一款应用程序的剖析工具即可(作为回报,一旦拥有这样的工具,就可以从一开始就写出高效的代码)。
建议在所有的新项目中都考虑包含性能剖析得代码。往已有的项目中假如性能剖析代码也许很困难,新项目就简单一些。

性能剖析本身会导致服务器变慢吗?

说"是的",是因为性能剖析确实会导致应用慢一点;说"不是",是因为性能剖析可以帮助应用运行得更快。
性能剖析和定期检测都会带来额外开销。问题在于这部分得开销有多少,并且由此获得得收益是否能够抵消这些开销。大多数设计和构建过高性能应用程序得人相信,应该尽可能地测量一切可以测量地地方,并且接受这些测量带来的额外开销,这些开销应该被当称应用程序的一部分。Oracle的性能优化大师Tom Kyte曾被问到Oracle中的测量点的开销,他的回答是,测量点至少为性能优化贡献了10%。对此我们深表赞同,而且大多数应用并不需要要每天都运行详细的性能测量,所以实际贡献甚至要超过10%。即使不同这个观点,为应用构建一些可以永久使用的轻量级的性能剖析也是有意义的。如果系统没有每天变化的性能统计,则碰到无法提前预知的性能瓶颈就是一件头痛的事情,发现问题的时候,如果有历史数据,则这些历史数据价值是无限的。而且性能数据还可以帮助规划好硬件采购、资源分配、以及预测周期性的性能尖峰。那么何谓"轻量级"的性能剖析?比如可以为所有的SQL语句计时,加上脚本总时间统计,这样做的代价不高,而且不需要在每次页面查看(page view)时都执行.如果流量趋势比较稳定,随机采样也可以,随机采用可以通过在应用程序中设置实现:

<?php
$profiling_enabled = rand(0,100) >99;
?>

这样只有1%的会话会执行性能采样,来帮助定位一些严重的问题。这种策略在生产环境中尤其有用,可以发现一些其他方法无法发现的问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/17588.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux系统编程学习笔记

1 前言 1.1 环境 平台&#xff1a;uabntu20.04 工具&#xff1a;vim,gcc,make 1.2 GCC Linux系统下的GCC&#xff08;GNU Compiler Collection&#xff09;是GNU推出的功能强大、性能优越的多平台编译器&#xff0c;是GNU的代表作品之一。gcc是可以在多种硬体平台上编译出可执…

java设计模式介绍和使用场景

设计模式是软件开发中常用的解决问题的通用方法。每种设计模式都有其特定的使用场景&#xff0c;了解这些场景可以帮助我们更好地选择合适的设计模式来解决问题。下面是一些常见的设计模式及其使用场景&#xff1a; 单例模式 (Singleton Pattern): 使用场景&#xff1a;当一个类…

BIGO前端CICD平台

本文首发于&#xff1a;https://github.com/bigo-frontend/blog/ 欢迎关注、转载。 我是谁 BIGO前端CICD平台&#xff0c;是一个服务于前端团队的全研发周期管理平台&#xff0c;已经是我们团队日常都要使用的工具了。 该平台实现了一键创建项目、发布编排、新建迭代、checkl…

uniapp 使用vuex 在app上能获取到state,小程序获取不到

1. 在根目录下新建store目录, 在store目录下创建index.js定义状态值import Vue from vue; import Vuex from Vuex; import Vuex from vuex; Vue.use(Vuex);const store new Vuex.Store({ state: { login: false, token: , avatarUrl: , userName: }, mutations: { lo…

JavaWeb Servelt原理

Servlet简介: Servlet的主要工作&#xff1a;处理客户端请求&#xff0c;生成动态响应&#xff0c;通常用于扩展基于HTTP协议的Web服务器。 Servlet技术是Java EE规范的组成部分&#xff0c;代表了服务器端的Java程序&#xff0c;主要负责处理来自客户端的Web请求&#xff0c;…

国内信创web中间件生态

国内信创web中间件生态 东方通 官网https://www.tongtech.com/pctype/25.html 宝蓝德 官网https://www.bessystem.com/product/0ad9b8c4d6af462b8d15723a5f25a87d/info?p101 金蝶天燕 官网 https://www.apusic.com/list-117.html 中创 官网http://www.inforbus.com…

数据库数据恢复—空间不足导致sqlserver数据库连接失效的数据恢复案例

数据库数据恢复环境&#xff1a; 某品牌r520服务器&#xff0c;服务器中有7块SAS硬盘&#xff0c;这7块硬盘组建了一组2盘raid1阵列和一组5盘raid5阵列&#xff0c;raid1阵列存储空间安装操作系统&#xff0c;raid5阵列存储空间存放数据。服务器上部署sql server数据库&#xf…

野外作战武器操作3D模拟实操仿真训练以便老兵能适应不同的训练需求

强国必须强军&#xff0c;我国在军事方面的投入持续加大&#xff0c;自然在军事武器培训方面不容忽视&#xff0c;在军事领域&#xff0c;3D模拟展示不仅提升了军事训练的效率&#xff0c;还为我们提供了更加直观、真实的武器体验。 首先&#xff0c;3D军事武器模拟展示能够提供…

Nacos 2.x 系列【6】持久化

文章目录 1. 前言2. Derby3. Mysql3.1 初始化脚本3.2 服务端配置3.3 验证 4. 数据源插件 1. 前言 Nacos中的用户、租户、服务配置等信息&#xff0c;需要使用关系型数据库进行存储&#xff0c;在实际开发中&#xff0c;可能还会面临各种数据库适配问题。 2. Derby Derby是Ap…

人工智能在脉搏分析中的应用

人工智能在脉搏分析中的应用正在逐步深化&#xff0c;其凭借强大的数据处理能力和模式识别技术&#xff0c;为脉搏波信号的处理和分析带来了革命性的变化。以下是人工智能在脉搏分析中的几个主要应用&#xff1a; 脉搏波信号的采集与处理&#xff1a; 脉搏波信号作为生物医学信…

【并发小知识】

计算机五大组成部分 控制器 运算器 存储器 输入设备 输出设备 计算机的核心真正干活的是CPU&#xff08;控制器运算器中央处理器&#xff09; 程序要想计算机运行&#xff0c;它的代码必须要先由硬盘读到内存&#xff0c;之后cpu取指再执行 操作系统发展史 穿孔卡片处理…

学习java第七十九天

AOP有两种实现方式&#xff1a;静态代理和动态代理。 静态代理 静态代理&#xff1a;代理类在编译阶段生成&#xff0c;在编译阶段将通知织入Java字节码中&#xff0c;也称编译时增强。AspectJ使用的是静态代理。 缺点&#xff1a;代理对象需要与目标对象实现一样的接口&#x…

Android Studio 中gradle的bin和all区别

1.在android studio中设置安装gradle时&#xff0c;真各种版本看到眼花缭乱&#xff0c;还有疑惑gradle-*.*-all.zip与gradle-*.*-bin.zip的区别是什么。下面解压如下: bin&#xff1a; all: 其实&#xff0c;用bin就可以了&#xff0c;all文件就是多了docs(文档)和src(源码)两…

选择源代码防泄漏方案需要考虑哪些因素?

选择加密软件是确保公司数据安全和保护知识产权的重要决策。 选择合适的加密软件&#xff1a;关键因素与推荐方案 一、稳定性&#xff1a;加密软件的核心 稳定性是评估加密软件的首要因素&#xff0c;它直接关系到企业数据的安全性和业务的连续性。 避免文件损坏&#xff1…

Java基础——Optional

Optional 类主要解决的问题是臭名昭著的空指针异常NPE&#xff08;NullPointerException&#xff09; 在 Java 8 之前&#xff0c;任何访问对象方法或属性的调用都可能导致 NullPointerException&#xff1a; String isocode user.getAddress().getCountry().getIsocode().to…

Linux网络-Socket套接字_Windows与Linux端双平台基于Udp传输协议进行多线程跨平台的服务器与客户端网络通信的简易聊天室实现

文章目录 一、Socket套接字二、socket 常见API1. int socket(int domain, int type, int protocol);2. int bind(int socket, const struct sockaddr *address, socklen_t address_len);struct sockaddr 3. ssize_t recvfrom(int socket, void *restrict buffer, size_t length…

go defer

type _defer struct {siz int32started boolopenDefer boolsp uintptrpc uintptrfn *funcval_panic *_paniclink *_defer }runtime._defer 结构体是延迟调用链表上的一个元素&#xff0c;所有的结构体都会通过 link 字段串联成链表。 只…

【全开源】酒店订单管理系统源码(FastAdmin+ThinkPHP)

一款基于FastAdminThinkPHP开发的旨在为民宿、酒店、宾馆等提供房态、订单、财务、客史等数据化、信息化的智慧管理工具&#xff0c;实现一站式订房管理&#xff0c;帮助酒店、民宿、宾馆提升管理效率&#xff0c;降低管理成本&#xff0c;提升行业竞争力。 打造高效、便捷的酒…

Generate Anything Anywhere in Any Scene #论文阅读

URL https://arxiv.org/pdf/2306.17154 TD;DR 2023 年 6 月 Wisconsin 的文章。围绕 ip 保持做的扩展任务&#xff0c;核心目标是对指定 ip 可以生成任意大小的&#xff08;指定 ip&#xff09;、任意背景的图片&#xff0c;同时可以通过 bbox 控制物体位置和多物体生成。主…

SOLIDWORKS教育版代理商应该如何选择?

SOLIDWORKS作为目前流行的三维设计软件在工程设计&#xff0c;制造和建筑中有着广泛的应用前景。教育版SOLIDWORKS软件是学生及教育机构学习教学的理想平台。 下面介绍几个挑选SOLIDWORKS教育版代理的关键要素: 1、专业知识与经验&#xff1a;代理商应掌握SOLIDWORKS等软件的丰…