ext4:(rw,noatime,nodiratime,nobarrier,data=ordered)
xfs: (rw,noatime,nodiratim,nobarrier,logbufs=8,logbsize=32k)
ssd:
trim
innodb_page_size=4k 减小块大小,提搞命中YU
innodb_flush_neighbors=0
EG:如果当前系统CPU内核16,读写比3:1
innodb_read_io_threads=12
innodb_write_io_threads=4
读写进程不能超过CPU总核算数
读写比即线程比
innodb_thread_concurrency=32 推荐CPU总核算数2倍
innodb_io_capacity=500 (依赖iops)
单盘SAS/SATA:200
SAS*12 RAID 10
数据系统是随机IO,系统预读会增加负担
网卡:
跟据应用容量规划
什么是优化?
the fastest way to do something is don't do it
应用系统优化,CACHE
the ways to improve performance,do it less or do it faster
索引
performance is all about code path
优化CODE路径
数据库优化
1.不访问不必要的数据
1.B TREE/HASH
2.COLUMM STORE 或者分表的方式将数据分开存储
2. 合理的利用硬件来提升访问效益
1.使用缓存,消除对数据的重复访问
2.批量处理来减少交互次数(磁盘,网络)
3.加硬件
3.提高系统的吞叶量
1.对工作单位进行细化,减少串行操作
2.优化硬件配置,提高整体的TCO与硬件利用YU
3.合理的拆分(水平,垂直)以提高系统的整体吞叶能力
水平拆分:分析应用访问特征,分成多个表
mysql配置优化-关闭QC
仅仅在活跃线程较小的情况下才可用
建议在应用系统中做cache
5.6后默认关闭
query_cache_type=0
query_cache_size=0
开启后锁太多
线程内存配置优化:MYSQL 线程使用内存:需要就申请,不需要求释放
max_used_connections * (
read_buffer_size+
read_rnd_buffer_size+
join_buffer_size+
sort_buffer_size+
binlog_cache_size+
thread_stack+
2*net_buffer_length
)
INNODB 内存配制优化:
innodb_buffer_pool_size
innodb_data_file_path
innodb_flush_log_at_trx_commit 5.6默认是1
innodb_log_buffer_size:事物大小
transaction_isolation: RC
innodb_flush_method=O_DIRECT
内存=INNODB内存+线程内存*线程个数
innodb_io_capacity:
磁盘最高支持的IOPS:SAS/SATA:200 RAID 10:2000 SSD:2000-5000 PCIE FLASH:5000-10000
SSD可以配置的高一些
随着磁盘数量增加而增大
默认innodb_io_capacity_max=min(2000,2*innodb_io_capacity)
innodb_thread_concurrency/innodb_max_concurrency_tickets
无线程池:
innodb_thread_concurrency=16-32 in 5.5
innodb_thread_concurrency=36 in 5.6
存在线程池:
innodb_thread_concurrency=0 is fine
innodb_max_concurrency_tickets:olap大些,OLTP小些(30)
线程事物执行时间
配制优化 -更大的REDO LOG ( REDO LOGS 小的话会导致 CHECKPOINT 数量越多,影响性能)
REDO LOGS 记录了所有的数据变更
恢复时间不再是一个问题(起用备库)
innodb_log_file_size=2047 before 5.6
innodb_log_file_size>=2047 from 5.6
越大系统性能更稳定
interactive_timeout:
mysql> show variables like '%interactive_timeout%';
+---------------------+-------+
| Variable_name | Value |
+---------------------+-------+
| interactive_timeout | 28800 |
+---------------------+-------+
1 row in set (0.00 sec)
wait_timeout:
mysql> show variables like '%wait_timeout%';
+--------------------------+----------+
| Variable_name | Value |
+--------------------------+----------+
| innodb_lock_wait_timeout | 50 |
| lock_wait_timeout | 31536000 |
| wait_timeout | 28800 |
+--------------------------+----------+
3 rows in set (0.00 sec)
open_file_limit:65535
mysql> show variables like 'open_file%';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| open_files_limit | 65535 |
+------------------+-------+
max_connections:
mysql> show variables like 'max_connections';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| max_connections | 151 |
+-----------------+-------+
设计优化-SCHEMA设计
表默认都设计自增列主键
字段尽可能使用空间小的类型
村绝TEXT/BLOB,可以做垂直拆分,或者转成MYISAM
所有字段显式定义NOT NULL
索引数量不要太多,有负作用
多使用联合索引,少用单独索引
字符型号列需要索引时,创建前缀索引
设计优化-无法使用索引的场景
通过索引找描的记录数超过过30%,变成全表扫描
联合索引中,第一个索引列使用范围查询
联合索引中,第一个查询条件不是最左索引列
模糊查询条件列最左以通配符%开始
两个独立索引,其中一个用于检索,一个用于排序
表关联字段类型不一样(也包括长度不一样)
索引字段条件上使用函数
设计优化-架构设计
减少物理IO,让MYSQL闲下来
转变随机IO为顺序IO
减小活跃起数据
分库分表
读发离
OLTP,OLAP分离