前言

首先任何一个数据库不是独立存在的,也不是凭空想象决定出来的。

数据库的架构离不开应用的场景。所以,为了解决某些深入的问题,首先你得掌握数据库的原理与架构。原理掌握得越深入,越能帮助你定位复杂与隐藏的问题。

其次,DBA不能只局限于数据库本身。因为问题的来源,很多时候都来自用户表象(比如说用户反映查询某个东西很慢)。这个表象 问题,可能来自从应用到数据库,到OS,存储等方面。或者是网络链路的任一环节等。

最后,DBA常需要关注的层面,除了应用,更重要的还有OS硬件相关的层面。如内存,CPU,磁盘等。

背景知识:数据库经典三层架构图

背景知识:MySQL体系架构

图1即为MySQL的逻辑架构图,可以简单地归结为四层结构:

第一层为客户端连接层,主要是做一些连接处理、权限认证、安全连接等处理。

第二层为服务管理层,实现了诸如SQL接口、解析、优化、缓存以及备份恢复、复制等核心功能。

第三层为插件存储引擎层,这是MySQL区别于其它数据库系统如ORACLE、MSSQL SERVER最重要的一点,MySQL中数据的存储和提取最终是由存储引擎来实现的,不同的存储引擎存取数据的方式不一样,它们通过统一的API与服务层进行通信。

第四层为数据存储层,确切地说它不属于MySQL系统,只是MySQL生成的数据、日志等文件最终是要保存在磁盘文件系统中的。

背景知识:MySQL体系架构

背景知识:MySQL内核架构

MySQL定位问题关注方面

数据库层面

  1. MySQL Slow log (80%的问题,都来自SQL应用的问题)
  2. Mysql error log
  3. MySQL统计状态信息
  4. Show global status;
  5. Show engine innodb status\G
  6. Show full processlist;
  7. Show master status
  8. Show slave status

OS层面

  1. 内存,磁盘,IO,网络等
  2. free, vmstat, iostat, top, sar -n DEV, demesg, perf等

有图表的情况下,尽量多通过图表方式来查看指标变化趋势。所谓一图顶千言。

MySQL定位问题思路与方法

排除法

  1. 排除应用问题(查看slow log)
  2. 排除OS问题(查看OS各类输出,图表等)
  3. 排除数据库本身问题(查看数据库,状态,延时等)

搜索路径(知识爆炸的时代,谁也不可能记住所有的问题)

  1. 百度
  2. 谷歌
  3. Oracle Support知识库  https://support.oracle.com/portal/

慢SQL问题定位方法

  1. Explain
  2. Show Profile
  3. mysqldumpslow

MySQL性能优化关注点

SQL及索引优化

  • 根据需求写出良好的SQL,并创建有效的索引,实现某一种需求可以多种写法,这时候我们就要选择一种效率最高的写法。这个时候就要了解sql优化
  • 数据库表结构优化
  • 根据数据库的范式,设计表结构,表结构设计的好直接关系到写SQL语句。

系统配置优化

  • 大多数运行在Linux机器上,如tcp连接数的限制、打开文件数的限制、安全性的限制,因此我们要对这些配置进行相应的优化。

硬件配置优化

  • 选择适合数据库服务的cpu,更快的IO,更高的内存。
  • 但不意味着越强越好。因为我们总是在成本与收益之间权衡。配置过低,性能无法满足要求。配置太高,造成浪费。
  • 我们应该在选择合理的配置,并预留部分资源以应对突发流量。

注:通过下图可以看出,该金字塔中,优化的成本从下而上逐渐增高,而优化的效果会逐渐降低。

性能优化的原则

  • 优化永远不会结束(也即不需要做无畏的优化)
  • 2/8理论,短板理论(改善20%的短板,提升80%的性能)

所谓性能优化,在大部分情况而言,就是找到导致性能的瓶颈所在,并加以解决。

案例分享

某部门系统从ORACLE数据库迁移到MySQL,碰到了严重的性能问题。实测TPS不足ORACLE DB的30%。

我的性能优化过程步骤:

  • 前期现场查看数据表定义,配置文件等。
  • 发现问题表没有使用主键,insert values一条一条插入导致速度很慢,配置文件参数不合适(innodb buffer pool, redo log, io_capacity等)等问题。
  • 现场测试,性能还是有问题(表象为Mysql服务器IO,CPU负载都很小)

    采用排除法

    • 用sysbench压测没有问题,排除硬件OS问题
    • 数据库查询状态正常,没有问题
    • 剩下,只能是应用问题。

      查看网络流量,抓取数据包,发现应用流量很小。

      代码排查,oracle以前用sequence。MySQL不支持,应用代码实现生成ID。

      这段代码有问题,出现锁争用,导致应用流量一直很小。

MySQL问题定位-性能优化之我见的更多相关文章

  1. MySql学习—— 查询性能优化 深入理解MySql如何执行查询

    本篇深入了解查询优化和服务器的内部机制,了解MySql如何执行特定查询,从中也可以知道如何更改查询执行计划,当我们深入理解MySql如何真正地执行查询,明白高效和低效的真正含义,在实际应用中就能扬长避 ...

  2. 2020重新出发,MySql基础,性能优化

    @ 目录 MySQL性能优化 MySQL性能优化简述 使用 SHOW STATUS 命令 使用慢查询日志 MySQL 查询分析器 EXPLAIN DESCRIBE 索引对查询速度的影响 MySQL优化 ...

  3. MySQL 基础及性能优化工具

    数据库,用户及权限 常用用户管理操作 # 创建本地用户 abc create user abc@localhost # 创建内网能够访问的用户 abc create user abc@'192.168 ...

  4. mysql配置以及性能优化(转)

    MySQL配置文件my.cnf中文详解,附mysql性能优化方法分享 ================================================================= ...

  5. 利用 gperftools 对nginx mysql 内存管理 性能优化

    利用 gperftools 对nginx 与 mysql  进行 内存管理  性能优化 降低负载. Gperftools 是由谷歌开发.官方对gperftools 的介绍为: These tools ...

  6. MySQL系列:性能优化

    1. 优化简介 MySQL性能优化包括:查询优化.数据库结构优化.MySQL服务器优化等. 2. 查询优化 2.1 分析查询语句 MySQL提供EXPLAIN和DESCRIBE,用来分析查询语句. E ...

  7. 2018/09/17《涂抹MySQL》【性能优化及诊断】学习笔记(七)

    读 第十三章<MySQL的性能优化与诊断> 总结 一说性能优化,整个人都像被打了鸡血一样

  8. MySQL抓包工具:MySQL Sniffer 和性能优化

    简介 MySQL Sniffer 是一个基于 MySQL 协议的抓包工具,实时抓取 MySQLServer 端的请求,并格式化输出.输出内容包访问括时间.访问用户.来源 IP.访问 Database. ...

  9. MySQL之查询性能优化(二)

    查询执行的基础 当希望MySQL能够以更高的性能运行查询时,最好的办法就是弄清楚MySQL是如何优化和执行查询的.MySQL执行一个查询的过程,根据图1-1,我们可以看到当向MySQL发送一个请求时, ...

随机推荐

  1. [USACO3.1]最短网络 Agri-Net

    题目背景 Farmer John 被选为他们镇的镇长!他其中一个竞选承诺就是在镇上建立起互联网,并连接到所有的农场.当然,他需要你的帮助. 题目描述 FJ 已经给他的农场安排了一条高速的网络线路,他想 ...

  2. 密码学系列之:feistel cipher

    密码学系列之:feistel cipher 简介 feistel cipher也叫做Luby–Rackoff分组密码,是用来构建分组加密算法的对称结构.它是由德籍密码学家Horst Feistel在I ...

  3. Centos7 安装 Keepalived

    目标: Keeplaived 简单模拟测试一下Nginx 故障切换前言:C7 默认的 1.3.5 似乎有点问题,改装 keepalived-2.0.7 1:安装 Nginx 和确认 (略)2:安装配置 ...

  4. ES2015+ 常用新特性一口气看个够

    ES2015 也叫 ES6,区别只是一个是以发布的年份来命名,一个是以版本号来命名 从那以后组织每年都会发布一个新版本,根据这个规则,ES2016 === ES7... ES2020 === ES11 ...

  5. Ubuntu安装ibmmq

    一.前言 安装整个ibmmq的过程中,真的气炸了,在网上搜索到的答案千篇一律,一个安装部署文档居然没有链接地址:为了找到这个开发版本的下载地址找了一下午,不容易啊.也提醒了自己写博文还是得有责任心,把 ...

  6. Java 设置Word文本框中的文字旋转方向

    Word文档中可添加文本框,并设置文本框为横向文本排列或是纵向文本排列,或者设置文本框中的文字旋转方向等.通过Java程序代码,也可以实现以上文本框的操作.下面以Java代码示例展示具体的实现步骤.另 ...

  7. linux下 大日志文件查看与搜索---less

    场景 有一个几十m的大日志文件,里边的记录是按时间排序的. 现在需要找到其中,不知道在什么位置的一条错误消息.这时候,想把内容拷出来都费劲,就算拷出来了,一般的编辑器也难以hold住这么大的文件.这时 ...

  8. Java中对象初始化过程

    Java为对象初始化提供了多种选项. 当new一个对象的时候,对象初始化开始: 1.首先,JVM加载类(只加载一次,所以,即使多次new对象,下面的代码也只会在第一次new的时候执行一次),此时, 静 ...

  9. Unity3D-UI--Layout组件

    Layout组件 自动排版 Layout Group Vertical Layout Group 垂直布局 [垂直布局组]组件将其子布局元素彼此重叠.它们的高度由各自的最小高度,首选高度和柔性高度决定 ...

  10. hdu 2159 二维完全背包

    Problem Description 最近xhd正在玩一款叫做FATE的游戏,为了得到极品装备,xhd在不停的杀怪做任务.久而久之xhd开始对杀怪产生的厌恶感,但又不得不通过杀怪来升完这最后一级.现 ...