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#文件或文件夹压缩和解压

    C#文件或文件夹压缩和解压方法有很多,本文通过使用ICSharpCode.SharpZipLib.dll来进行压缩解压 1.新建一个winform项目,选择项目右键 管理NuGet程序包,搜索ICSh ...

  2. linux下查看指定进程的所有连接信息(转)

    定位某个进程的网络故障时经常需要用到的一个功能就是查找所有连接的信息.通常查找某个端口的连接信息使用 ss 或者 netstat 可以轻松拿到,如果是主动与别的机器建立的连接信息则可以通过 lsof ...

  3. pdf 中内容的坐标系

    PDF Page Coordinates (page size, field placement, etc.) AcroForm, Basics, Automation Page coordinate ...

  4. etcd常用命令记录

    etcd常用命令记录   1.查看etcd的版本 [root@etcd01 ssl]# curl -L http://127.0.0.1:2379/version {"etcdserver& ...

  5. 004 API约定

    在具体的学习前,我还是决定学一下,REST风格中在ES中的约定. 1.多重索引 先准备数据: 如果不小心,json里的值写错了,修改过来,重新执行即可. PUT index1/_doc/1 { &qu ...

  6. SonarQube Detection of Injection Flaws in Java, C#, PHP

    Code Quality Tools Review: Sonar, PMD, Findbugs and Checkstyle Sonar CheckStyle, FindBugs and PMD - ...

  7. php redis set 单机锁(转)

    如果一个请求更新缓存的时间比较长,甚至比锁的有效期还要长,导致在缓存更新过程中,锁就失效了,此时另一个请求会获取锁,但前一个请求在缓存更新完毕的时候,如果不加以判断直接删除锁,就会出现误删除其它请求创 ...

  8. 基于Source Insight_Scan的C/C++静态代码检查工具安装说明

    基于Source Insight_Scan的C/C++静态代码检查工具安装说明   本文链接:https://blog.csdn.net/M19930517/article/details/79977 ...

  9. python解决排列组合

    笛卡尔积:itertools.product(*iterables[, repeat]) import itertools for i in itertools.product('BCDEF', re ...

  10. Python - Django - ORM 外键操作

    models.py: from django.db import models # 出版社 class Publisher(models.Model): id = models.AutoField(p ...