首页 > LNMP >

mysql5.7比mysql5.5慢?你需要读下这篇优化说明

  

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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
[client]
#password   = your_password
port        = 3306
socket      = /tmp/mysql.sock

[mysqld]
port        = 3306
socket      = /tmp/mysql.sock
datadir = /home/mysql/var
skip-external-locking
#skip_name_resolve如果不配的后果:mysql server每一次会对客户端连接使用反向dns解析,经常会出现客户端连上后有timeout现象
skip_name_resolve = 1
key_buffer_size = 1M
max_allowed_packet = 16M
table_open_cache = 256
#每个会话执行排序操作所分配的内存大小。想要增大max_sort_length参数,需要增大sort_buffer_size参数。如果在SHOW GLOBAL STATUS输出结果中看到每秒输出的Sort_merge_passes状态参数很大,可以考虑增大sort_buffer_size这个值来提高ORDER BY 和 GROUP BY的处理速度。建议设置为1~4MB。
sort_buffer_size = 1M
net_buffer_length = 8K
read_buffer_size = 1M
#就是当数据块的读取需要满足一定的顺序的情况下,MySQL 就需要产生随机读取,进而使用到 read_rnd_buffer_size参数所设置的内存缓冲区。它的默认为256k,最大可以设到2G,它会对order by关键字起作用,当order by的计划成本超出了sort_buffer_size后,mysql会产用随机读取并消耗额外的内容,很多外面的博客说它是只对myisam引擎起作用,但其实不是,该参数还真的覆盖到所有引擎,一般它的推荐设置在8-16M
read_rnd_buffer_size = 8M
myisam_sort_buffer_size = 16M
#对于JOIN KEY 有索引和二级索引,JOIN KEY 无索引mysql会使用到join_buffer_size,一般建议设置一个很小的 GLOBAL 值,完了在 SESSION 或者 QUERY 的基础上来做一个合适的调整。如果你拍脑袋给也个4g,我们有1000个并发,就是用掉了4T的内存。。。4T啊
join_buffer_size = 1M
thread_cache_size = 32
query_cache_size = 32M
#通过设置tmp_table_size选项来增加一张临时表的大小,例如做高级GROUP BY操作生成的临时表。默认系统为32M,如果当你的临时表越来越多加在一起超过了这个值,那么mysql会在系统磁盘上创建,这个值不是越多越好,也没有一个合适的值。
tmp_table_size = 64M
performance_schema_max_table_instances = 8000

explicit_defaults_for_timestamp = true
#skip-networking
max_connections = 500
max_connect_errors = 100
open_files_limit = 65535

#log-bin=mysql-bin
#binlog_format=mixed
#如果没有做任何主从复制,server-id以不设
server-id   = 1
expire_logs_days = 10
early-plugin-load = ""

default_storage_engine = InnoDB
innodb_file_per_table = 1
innodb_data_home_dir = /home/mysql/var
innodb_data_file_path = ibdata1:10M:autoextend
innodb_log_group_home_dir = /home/mysql/var
#transaction_isolation此参数直接决定了mysql的性能。如果不配的后果:默认就是repeatable-read
transaction_isolation = READ-COMMITTED
#interactive_timeout系统默认为:28800s即8小时。如果这个值太大,你会发觉在mysql中有大量sleep的连接,这些连接又被称为:僵尸连接,僵尸连接一多你真正要用的时候就会抛:too many connection这样的错,因此对于长久不用的连接,我们一般要使用“踢出机制”
interactive_timeout = 600
#同interactive_timeout,两个值都设成一样。
wait_timeout = 600
#innodb_buffer_pool_size这个值和innodb_buffer_pool_instances相辅相成。在32位机器下,innodb_buffer_pool_instances一般为1,在64位机器上,这个值为8-64,pool_instances其实为cpu核数,作用是利用多核心减小竞争提高并发性,使用散列函数将存储在缓冲池中或从缓冲池读取的每个页面随机分配给其中一个缓冲池实例,innodb_buffer_pool_size的设置需要为pool_instance的整数倍。强烈建议设成内存的20%-65%间(独立的mysql服务器)
innodb_buffer_pool_instances = 8
innodb_buffer_pool_size = 512M
#innodb_buffer_pool_load_at_startupstartup=1以加快这个“预热”过程,它与参数shutdown配合使用,即相当于把上次使用的innot_db_buffer_pool里的东西在启动时先做一次加载,以加快mysql的性能。它会在innodb的数据目录中生成一个文件:ib_buffer_pool。高度注意:加入了startup和shutdown=1时,mysql的启动过程会比较慢,它的影响就是你在mysql重启后,一开始你的系统读写性能不如在你系统运行了2-4小时(视db读写而定)反而它的读写性能变好了
innodb_buffer_pool_load_at_startup = 1
innodb_buffer_pool_dump_at_shutdown = ON
#innodb_buffer_pool_dump_pct锦上添花的值,非必要,通常来说我们会设成25%。对于大并发前提下我们会使用40这个值,这个值越大,mysql启动时间越长。它是你的innodb_buffer_pool_size的百分比,MySQL默认在InnoDB缓冲池(而不是整个缓冲池)中仅保留最频繁访问页的25%。如果有100GB的缓冲池,但只有10GB的数据,默认只有10GB的25%(即2.5GB)数据保存在内存中。在多数使用场景下,合理的选择是:保留最有用的数据页
innodb_buffer_pool_dump_pct=25
#innodb_log_file_size这个值的默认为5M,是远远不够的,在安装完mysql时需要尽快的修改这个值,如果对 Innodb数据表有大量的写入操作,那么选择合适的 innodb_log_file_size值对提升MySQL性能很重要。然而设置太大了,就会增加恢复的时间,因此在MySQL崩溃或者突然断电等情况会令MySQL服务器花很长时间来恢复。
innodb_log_file_size = 128M
#innodb_log_buffer_size这是mysql5.7里新带的特性,它的默认在8m,缓冲区更大能提高性能,但意外的故障将会丢失数据.官方的方档建议设置为1-8M之间!但是对于大量有事务操作的mysql我们推荐在写操作库上设置:16m
innodb_log_buffer_size = 8M
#innodb_flush_log_at_trx_commit配置说明:除非你用的是小型机或者是超大规模mysql集群一类如:游戏行业,那么需要保留每一秒的事务,否则请设成2,要不然会严重影响系统性能。这个参数是5.6所没有的。
#1代表:每次事务提交时MySQL都会把log buffer的数据写入log file,并且flush(刷到磁盘)中去,该模式为系统默认(因此会保留每一份redo日志)
#2代表:每次事务提交时MySQL都会把logbuffer的数据写入logfile,但是flush(刷到磁盘)操作并不会同时进行。该模式下,MySQL会每秒执行一次flush(刷到磁盘)操作。该模式速度较快,也比0安全,只有在操作系统崩溃或者系统断电的情况下,上一秒钟所有事务数据才可能丢失。
innodb_flush_log_at_trx_commit = 2
innodb_lock_wait_timeout = 50
#innodb_page_size这个我们是在全真生产环境、全数据量下用测试工具去对4k,8k,16k三种场景压测得到的吞吐量即tps来做观察的,我这边可以给出一个推荐值,以单表超1000w条数据基于中台1.1的数据库结果(每个表都超1000w),我们在设置该值为:8K时,它的吞吐达到最优。这个值可要小心,一般它在设置后就不能轻易改了,一般来说我们都认为,值越大越好,不是的,这个值它的原理是这样的:size越小,内存划分粒度越大,使用率越高,但是会有其他问题,就是限制了索引字段还有整行的大小。
innodb_page_size = 8K
#innodb_io_capactiy 在sas 15000转的下配置800就可以了,在ssd下面配置2000以上。默认为200,db吞吐量上不去。
innodb_lru_scan_depth = 2000
#innodb_io_capacity_max这个值很重要,它对读无效,对写很有决定意义。它会直接决定mysql的tps(吞吐性能),
#这边给出参考:sata/sas硬盘这个值在200. sas raid10:2000,ssd硬盘:8000,fusion-io(闪存卡):25,000-50,000,#
本调优基于的是ssd,此值设置为8000,需要根据paas或者是ias的vm的硬盘性号来定,默认为200,系统吞吐上不去。
innodb_io_capacity_max = 8000
#innodb_io_capacity它是io_capacity_max的一半,同样,它对读无效对写有决定意义。
innodb_io_capacity_max = 4000
#innodb_flush_method推荐使用O_DIRECT,它的默认值为fdatasync。让我们一起来理解一下,它有3种模式:fdatasync它对磁盘的io读写会很频繁,O_DIRECT则表示我们的write操作是从mysql innodb buffer里直接向磁盘上写,它会充分利用缓存,_DIRECT模式的free内存下降比较慢,O_DIRECT在SQL吞吐能力上较好。
innodb_flush_method = O_DIRECT
#innodb_file_format推荐使用Barracuda模式,它是启用表压缩用的.innodb_file_format有这么几种模式:Antelope-羚羊模式,支持Redundant(冗余)、Compact(紧凑)模式,Barracuda-梭子鱼,是InnoDB Plugin支持的文件格式,在原来的基础上新增了两种数据表格式的支持:Dynamic 和 Compressed,因此我推荐使用:Barracude模式,因为它可以兼容其它数据模式。它默认使用的是叫“联合模式”,即不是棱子鱼也不是羚羊。
innodb_file_format = Barracuda
#innodb_file_format_max这个参数必须和innodb_file_format参数一致,一定记住,要不然不生效。
innodb_file_format_max = Barracuda
#innodb_log_group_home_dir = /redolog/ 这种路径的都可由运维决定,记得挂在大磁盘下。未启用
#innodb_undo_directory = /undolog/ 这种路径的都可由运维决定,记得挂在大磁盘下。未启用
#innodb_undo_logs = 128 指定回滚段的个数(早期版本该参数名字是innodb_rollback_segments),默认就是128。
#innodb_undo_tablespaces 推荐:3,默认为3
#innodb_flush_neighbors 这个参数很要紧,目前在ssd盛行的情况下我们都把它设为0(不开启),如果你设置成了1即开启(默认状态)InnoDB就会刷新一个extent中的所有页面,因为SSD在随机IO上没有额外负载,所以不需要启用该特性,开启了反而多此一举。它的默认是1,不是0.这个参数对机性硬盘来说很有效,可以减少随机io,增加性能。如果是ssd类磁盘,建议设置为0,可以更快的刷新脏页。如果你把它设为1同时又是ssd那就显得没必要了。
innodb_flush_neighbors = 0
#innodb_large_prefix不配会有问题,特别是索引会无效、或者不是走最优计划,如果你的字符集是utf8mb4,那么这个值必开启。
innodb_large_prefix = 1
#innodb_thread_concurrency 安装mysql的服务器的cpu的核数,如:64核cpu,那么推荐:64(<=cpu核数),如果一个工作负载中,并发用户线程的数量小于等于64,建议设置0
innodb_thread_concurrency = 8
#innodb_strict_mode必须开启,没得选择,1,为什么?从MySQL5.5.X版本开始,你可以开启InnoDB严格检查模式,尤其采用了页数据压缩功能后,最好是开启该功能。开启此功能后,当创建表(CREATE TABLE)、更改表(ALTER TABLE)和创建索引(CREATE INDEX)语句时,如果写法有错误,不会有警告信息,而是直接抛出错误,这样就可直接将问题扼杀在摇篮里。
innodb_strict_mode = 1
#show_compatibility_56推荐打开。这个参数是兼容mysql5.6版的INFORMATION_SCHEMA.GLOBAL_STATUS相关功能的,它有利于从5.6到5.7的过渡时非mysql专职dba但是懂mysql的运维用的。默认是off。相当于严格模式。
show_compatibility_56=on

[mysqldump]
quick
max_allowed_packet = 32M

[mysql]
no-auto-rehash

[myisamchk]
key_buffer_size = 64M
sort_buffer_size = 1M
read_buffer = 2M
write_buffer = 2M

[mysqlhotcopy]
interactive-timeout

[mysqld_safe]
malloc-lib=/usr/lib/libjemalloc.so

账号密码登录