MySQL性能瓶颈原因

硬件、系统因素

CPU

磁盘I/O

网络性能

操作系统争用

MySQL相关因素

数据库设计

索引、数据类型

应用程序性能

特定请求、短时事务

配置变量

缓冲区、高速缓存、InnoDB

瓶颈分析工具

sysstat工具集

sar、iostat、pidstat、mpstat

perf top

实时显示系统/进程的性能统计信息

pt-ioprofile

MySQL中的iotop

pstack

当MySQL里有线程hang住时,利用pstack排查由于哪些函数调用存在问题

硬件优化

BIOS配置优化

CPU设置最大性能模式,关闭C1E,C-stats

内存设置最大性能模式

关闭NUMA(并关注innodb_numa_interleave选项)

RAID配置优化

RAID-10

CACHE & BBU

WB & FORCE WB (WB是好的,WT是不好的)

使用PCIe-SSD等高速I/O设备

$ numactl --hardware
available: 1 nodes (0)
node 0 cpus: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
node 0 size: 65415 MB
node 0 free: 4086 MB
node distances:
node   0
  0:  10

available大于1说明numa没关闭

系统优化

io scheduler

deadline(机械盘)/noop(SSD盘)

filesystems

xfs(强烈建议)

ext4(备选)

kernel

vm.swappiness=1~5 (rhel7以后,设置0要慎重)

vm.dirty_background_radio=5

vm.dirty_radio=10

MySQL配置优化

innodb_buffer_pool_size

innodb_log_file_size >= 1G & innodb_log_files_in_group >= 3

innodb_flush_log_at_trx_commit & sync_binlog = ?

innodb_max_dirty_pages_pct

innodb_thread_concurrency = 0

innodb_io_capacity & innodb_io_capacity_max

innodb_max_purge_lag = 0

innodb_autoinc_lock_mode = 2 & binlog_format = row

max_binlog_cache_size

sort/join/read/read rrd buffer、tmp/heap table (session级别的内存不要设置太高)

thread_handling = one-thread-per-connection | pool-of-thread

long_query_time = 0.05

log_error_verbosity = 3

time_zone = "+8:00"  (默认值SYSTEM,设置为具体时区即可)

open_files_limit = 65535

back_log = (max_connections * 2)

max_execution_time = 10000 (/*+ MAX_EXECUTION_TIME(10000)*/)

SCHEMA设计优化

核心宗旨

表越窄越好 - 数据类型够用就好,保持高效

表越小越好 - 数据冷热分离,只留最新热数据

查询够高效 - 令每个SQL效率足够高,不阻塞

InnoDB使用

INT AUTO_INC PK for InnoDB

INT unsigned for IPV4, not CHAR(15)

TINYINT for ENUM type

TEXT、BLOB,or in compressed,并且尽量拆分到子表

JOIN列类型(包括长度、字符集)保持一致

多表JOIN时,排序列一定要属于驱动表,否则有额外filesort

select ... from a straight_join b where ... order by b.x;  需要额外的filesort

所有列设置NOT NULL

主键/唯一索引性能优于普通索引

联合索引比普通索引更合适

基数(cardinality)小的列不建独立索引,因为不支持bitmap索引

长字段使用部分索引,而非全部

可以利用冗余反向字段用于反向检索

sphinx等代替like '%xx%'搜索

SQL优化

多用简单SQL

少用子查询(不熟悉子查询时)

少用复杂表JOIN,并且注意JOIN方式

WHERE条件中不使用函数、表达式(虚拟列变通)

注意类型隐式转换

固定业务逻辑封装成存储过程(存储过程可能会影响未来分库分表、读写分离架构)

限制结果集大小

分页改成基于主键的JOIN或子查询

动态改造成静态,或者降低更新频率

从产品端消减不必要的业务

逻辑优化

以下场景,都可以在redis或cache中暂存,最后再定时持久化存储到DB

游戏人员移动,或是一些技能背包字段的设计,更新可以做合并更新等

过节时人们的发短信或是祝福行为

文章被访问每次加1

用户登录每次加1

MySQL性能瓶颈定位

优化耗时/逻辑读 top sql

找到耗时最慢的 top sql (PFS.events_statements_history_long)

排序TIMER_WAIT/ROWS_EXAMINED/ROWS_SENT

定位这些SQL的性能瓶颈(PFS.events_stages_history_long/profiling)

优化物理逻辑 i/o top sql

找到逻辑 i/o 请求最多的对象 (PFS.table_io_waits_summary_by_table)

找到物理 i/o 请求最多的对象 (sys.io_global_by_file_by_bytes)

定位、优化这些请求

不建议打开pfs

几个案例

insert慢的几种场景

innodb_thread_concurrency > 0

innodb_max_purge_lag > 0

innodb_io_capacity太小

redo & binlog 2PC

锁等待

semi-sync延迟

disk full

中间件性能太差,导致mysqld server端大量请求被阻塞

SQL瓶颈分析之PROFILE

mysql> set profiling=1;

mysql> select * from customer order by address_id;

mysql> show profiles;

mysql> show profile for query 1;

SQL效率对比分析之SHOW STATUS

mysql> flush status;

mysql> select * from customer order by address_id;

mysql> show status like 'handler_read_%';

内存临时表

基于内存的临时表(in-memory internal temporary tables),引擎由默认的memory改成了新的TempTable引擎

默认内存相对于tmp-table-size,从16M提升到1G

对varchar、varbinary的处理效率更高

internal_tmp_mem_storage_engine = TempTable | MEMORY

设置变量temptable_max_ram 来控制实际存储内存区域大小,默认为1G

slow query log

解析:

mysqldumpslow

pt-query-digest(推荐)

也可以启用general log + pt-query-digest

可视化管理:Box Anemometer/Query-Digest-UI

相关选项:

long-query-time = 0.01

log_queries_not_using_indexes = 1

log_throttle_queries_not_using_indexes = 60

min_examined_row_limit = 100

log_slow_admin_statements = 1

log_slow_slave_statements = 1

5.7 & 8.0 版本下,可以利用sys schema.statement_analysis视图

执行次数最多的TOP 10 SQL

select ... order by exec_count desc limit 10

平均响应耗时最慢的TOP 10 SQL

select ... order by avg_latency desc limit 10

每次扫描行数最多的TOP 10 SQL

select ... order by rows_examined desc limit 10

优先级高:执行次数多,高峰期慢SQL,核心业务慢SQL

优先级低:执行时间长,低谷期慢SQL,周边业务慢SQL

全面优化MySQL的更多相关文章

  1. 简单的方式优化mysql

    参考博客 自己笔记本上向mysql导入txt数据,有一个table导入了将近4个小时,而且多个table之间都是相互之间存在关系的,所以做联合查询的时候你会发现问题会十分的多,我之前联合查询两个表就死 ...

  2. TCMalloc优化MySQL、Nginx内存管理

    TCMalloc的全称为Thread-Caching Malloc,是谷歌开发的开源工具google-perftools中的一个成员. 与标准的glibc库的Malloc相比,TCMalloc库在内存 ...

  3. 优化MySQL,还是使用缓存?读一篇文章有感

    今天我想对一个Greenfield项目上可以采用的各种性能优化策略作个对比.换言之,该项目没有之前决策强加给它的各种约束限制,也还没有被优化过. 具体来说,我想比较的两种优化策略是优化MySQL和缓存 ...

  4. jemalloc优化MySQL、Nginx内存管理

    上一篇文章<TCMalloc优化MySQL.Nginx.Redis内存管理>,下面来看下jemalloc jemalloc源于Jason Evans 2006年在BSDcan confer ...

  5. TCMalloc优化MySQL、Nginx、Redis内存管理

    TCMalloc(Thread-Caching Malloc)与标准glibc库的malloc实现一样的功能,但是TCMalloc在效率和速度效率都比标准malloc高很多.TCMalloc是 goo ...

  6. MYSQL之性能优化 ----MySQL性能优化必备25条

    今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我 们程序员需要去关注的事情.当我们去设计数据库表结构,对操作数 ...

  7. 开启Mysql慢查询来优化mysql

    开启Mysql慢查询来优化mysql 优化sql语句是优化数据库的一个很重要的方面,那么怎么发现那些耗时耗资源的sql语句呢,开启Mysql慢查询! 1.查看是否开启慢查询,默认情况下是关闭的.你的m ...

  8. SQL优化 MySQL版 - B树索引详讲

    SQL优化 MySQL版  - -B树索引详讲 作者:Stanley 罗昊 [转载请注明出处和署名,谢谢!] 为什么要进行SQL优化呢?很显然,当我们去写sql语句时: 1会发现性能低 2.执行时间太 ...

  9. SQL优化 MySQL版 -分析explain SQL执行计划与笛卡尔积

    SQL优化 MySQL版 -分析explain SQL执行计划 作者 Stanley 罗昊 [转载请注明出处和署名,谢谢!] 首先我们先创建一个数据库,数据库中分别写三张表来存储数据; course: ...

  10. SQL优化 MySQL版 - 索引分类、创建方式、删除索引、查看索引、SQL性能问题

    SQL优化 MySQL版  - 索引分类.创建方式.删除索引.查看索引.SQL性能问题 作者 Stanley 罗昊 [转载请注明出处和署名,谢谢!] 索引分类 单值索引 单的意思就是单列的值,比如说有 ...

随机推荐

  1. C前序遍历二叉树Morris Traversal算法

    首先来递归算法,简单易懂: #include <stdio.h> #include <stdlib.h> #include <stdbool.h> typedef ...

  2. curl获得cookie数据<转>

    CURL *curl; CURLcode res; struct curl_slist *headers = NULL; curl_global_init(CURL_GLOBAL_ALL); curl ...

  3. 右键查看别人网页的js代码为什么会显示乱码

    查看别人网页的js显示乱码 解决方法: 打开浏览器,选择设置,点击更多,选择文字编码为Unicode

  4. Qt动画框架The Animation Framework

    动画框架是Kinetic(运动)项目的一部分,它的目标是提供一中简单的方法创建动画的和流畅的GUI.借助Qt动画属性,可以提供非常自由的动画窗体组件和其他对象(QObjects).动画框架也能被用于图 ...

  5. Eclipse 的快捷键以及文档注释、多行注释的快捷键 一、多行注释快捷键

    一.多行注释快捷键 1.选中你要加注释的区域,用ctrl+shift+C 或者ctrl+/ 会加上//注释2.先把你要注释的东西选中,用shit+ctrl+/ 会加上/*    */注释 3.以上快捷 ...

  6. C# Area 双重路由

    在WebApi项目里面 一般除了接口, 还有管理端...一些乱七八糟的,你想展示的东西, 一种做法是分开写: 比如管理后台一个项目, 然后接口一个, 然后页面一个, 其实这样做也可以,但是这么做, 无 ...

  7. Python的collections之namedtuple的使用及其优势

    类实现: class User: def __init__(self, name, age, height): self.name = name self.age = age self.height ...

  8. shell编程系列3--命令替换

    shell编程系列3--命令替换 命令替换 命令替换总结 方法1 `command` 方法2 $(command) 例子1: 获取系统的所有用户并输出 for循环能以空格.换行.tab键作为分隔符 [ ...

  9. linux删除用户报错:userdel: user prize is currently used by process 28021

    之前创建了一个普通用户prize,现在想删掉它: [root@VM_0_14_centos /]# userdel prize userdel: user prize 发现原来我克隆了一个会话,另一个 ...

  10. js 实现复制粘贴

    js 实现复制粘贴 <!DOCTYPE html> <html><head> <meta http-equiv="Content-Type" ...