全面优化MySQL
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的更多相关文章
- 简单的方式优化mysql
参考博客 自己笔记本上向mysql导入txt数据,有一个table导入了将近4个小时,而且多个table之间都是相互之间存在关系的,所以做联合查询的时候你会发现问题会十分的多,我之前联合查询两个表就死 ...
- TCMalloc优化MySQL、Nginx内存管理
TCMalloc的全称为Thread-Caching Malloc,是谷歌开发的开源工具google-perftools中的一个成员. 与标准的glibc库的Malloc相比,TCMalloc库在内存 ...
- 优化MySQL,还是使用缓存?读一篇文章有感
今天我想对一个Greenfield项目上可以采用的各种性能优化策略作个对比.换言之,该项目没有之前决策强加给它的各种约束限制,也还没有被优化过. 具体来说,我想比较的两种优化策略是优化MySQL和缓存 ...
- jemalloc优化MySQL、Nginx内存管理
上一篇文章<TCMalloc优化MySQL.Nginx.Redis内存管理>,下面来看下jemalloc jemalloc源于Jason Evans 2006年在BSDcan confer ...
- TCMalloc优化MySQL、Nginx、Redis内存管理
TCMalloc(Thread-Caching Malloc)与标准glibc库的malloc实现一样的功能,但是TCMalloc在效率和速度效率都比标准malloc高很多.TCMalloc是 goo ...
- MYSQL之性能优化 ----MySQL性能优化必备25条
今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我 们程序员需要去关注的事情.当我们去设计数据库表结构,对操作数 ...
- 开启Mysql慢查询来优化mysql
开启Mysql慢查询来优化mysql 优化sql语句是优化数据库的一个很重要的方面,那么怎么发现那些耗时耗资源的sql语句呢,开启Mysql慢查询! 1.查看是否开启慢查询,默认情况下是关闭的.你的m ...
- SQL优化 MySQL版 - B树索引详讲
SQL优化 MySQL版 - -B树索引详讲 作者:Stanley 罗昊 [转载请注明出处和署名,谢谢!] 为什么要进行SQL优化呢?很显然,当我们去写sql语句时: 1会发现性能低 2.执行时间太 ...
- SQL优化 MySQL版 -分析explain SQL执行计划与笛卡尔积
SQL优化 MySQL版 -分析explain SQL执行计划 作者 Stanley 罗昊 [转载请注明出处和署名,谢谢!] 首先我们先创建一个数据库,数据库中分别写三张表来存储数据; course: ...
- SQL优化 MySQL版 - 索引分类、创建方式、删除索引、查看索引、SQL性能问题
SQL优化 MySQL版 - 索引分类.创建方式.删除索引.查看索引.SQL性能问题 作者 Stanley 罗昊 [转载请注明出处和署名,谢谢!] 索引分类 单值索引 单的意思就是单列的值,比如说有 ...
随机推荐
- Leet Code 771.宝石与石头
Leet Code编程题 希望能从现在开始,有空就做一些题,自己的编程能力太差了. 771 宝石与石头 简单题 应该用集合来做 给定字符串J 代表石头中宝石的类型,和字符串 S代表你拥有的石头. S ...
- 小福bbs-冲刺日志(第六天)
[小福bbs-冲刺日志(第六天)] 这个作业属于哪个课程 班级链接 这个作业要求在哪里 作业要求的链接 团队名称 小福bbs 这个作业的目标 后端努力完成大部分功能操作,前端UI完成大部分功能测试 作 ...
- CMU Database Systems - Sorting,Aggregation,Join
Sorting 排序如果可在内存里面排,用经典的排序算法就ok,比如快排 问题在于,数据表中的的数据是很多的,没法一下都放到内存里面进行排序 所以就需要用到,外排,多路并归排序 看下最简单的,2路并归 ...
- GIS地理工具案例教程——批量去除多边形的重叠部分
GIS地理工具案例教程--批量去除多边形的重叠部分 商务合作,科技咨询,版权转让:向日葵,135-4855__4328,xiexiaokui#qq.com 问题:几乎所有的手工生产的数据,都存在多边形 ...
- MySQL按日期分组并统计截止当前时间的总数(实例教程)
MySQL按日期分组并统计截止当前时间的总数 建表语句 SET NAMES utf8mb4; ; -- ---------------------------- -- Table structure ...
- crontab 使用日期时间命名重定向文件
使用月份命名 0 12 * * * sh /tmp/test.sh >> "/tmp/$(date +"\%Y-\%m").log" 2>&a ...
- 000 装docker
直接参考别人的文章,经过验证,没有问题,需要网络. URL: https://www.cnblogs.com/qgc1995/archive/2018/08/29/9553572.html 我是虚拟机 ...
- PostgreSQL 登录时在命令行中输入密码
有时候需要设置定时任务直接执行 sql 语句,但是 postgresql 默认需要人工输入密码,以下命令可以直接在命令行中直接填入密码 PGPASSWORD=pass1234 psql -U MyUs ...
- JS 数字相加出现多个小数的问题
今天在页面上用到了js进行小数相加119.01+0.01,结果大家都知道应该是:119.02的,然而结果是119..0200000…. ,莫名其妙的,还以为是我写的程序有问题,后来查了下才知道这是ja ...
- SpringCloud学习成长之十四 服务注册(consul)
这篇文章主要介绍 spring cloud consul 组件,它是一个提供服务发现和配置的工具.consul具有分布式.高可用.高扩展性. 一.consul 简介 consul 具有以下性质: 服务 ...