前言

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

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

其次,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. Java-数组拷贝

    数组拷贝 首先了解深拷贝 浅拷贝数组的四种拷贝方式: 1.for循环拷贝 代码示例: import java.util.Arrays; public class TestDemo{ public st ...

  2. UF_VIEW 视图操作

    Open C   uc6400uc6401uc6402uc6403uc6404uc6405uc6406uc6408uc6409uc6430uc6431uc6432uc6433  获得视图3×3矩阵uc ...

  3. QueryTable的使用以及错误

    1.QuerySeter的filter使用遇到的错误 1.1 Filter里的字段名和操作符要用双下划线."__" 不是" _",否则会被认为成是列名的一部分, ...

  4. Django基础之auth模块

    内容概要 用户认证模块auth auth模块补充 auth_user表扩展字段 内容详细 auth模块 主要是用来做用户相关的功能 注册 登录 验证 修改密码 注销 ​ 访问admin需要管理员账号 ...

  5. 超赞!IDEA 最新版本,支持免打扰和轻量模式!

    IntelliJ IDEA 2020.1 的第二个早期访问版本已发布,新的 EAP 构建对调试器和事件探查器(Profiler)进行了改进,并引入了新的提交工具窗口(Commit toolwindow ...

  6. Project Reactor 响应式编程

    目录 一. 什么是响应式编程? 二. Project Reactor介绍 三. Reactor核心概念 Flux 1. just() 2. fromArray(),fromIterable()和 fr ...

  7. SqlServer中offset..fetch 的使用问题

    好久没更新了,最近忙的很,也生病了,重感冒,555~~~ 早上抽的一丝空闲,来讲讲SqlServer中的分页问题.其实用过了多种数据库,分页这问题已经是老生常谈的问题了.不管是开发什么类型的网站,只要 ...

  8. python安装、卸载包的方法

    anaconda包管理器 conda命令[1] 环境管理 conda info -e # 查看当前已安装的环境 conda create -n py27 python=2.7 # 添加2.7版本的Py ...

  9. python读取json文件制作股票价格走势

  10. Java常见面试题 非常实用【个人经验】

    必收藏的Java面试题 目录 Java 面试题 一.容器部分 二.多线程部分 三.SpringMvc部分 四.Mybatis部分 五.MySQL部分 六.Redis部分 七.RabbitMQ部分 八. ...