Mysql 的性能优化主要可以从几方面入手

1.硬件
2.Mysql配置以及系统配置
3.数据库表结构以及架构设计
4.SQL语句以及索引

__成本:__硬件>Mysql配置以及系统配置>数据库表结构以及架构设计>SQL语句、索引

__效果:__硬件<Mysql配置以及系统配置<数据库表结构以及架构设计<SQL语句、索引

1.硬件

就是砸钱,升级配置

2.Mysql配置以及系统配置调优

先查看下配置文件的加载顺序,有可能系统存在多个配置文件,后面的优先级高于前面的

/usr/sbin/mysqld --verbose --help | grep -A 1 'Default options'

结果展示:

2018-08-19 11:57:13 0 [Note] /usr/sbin/mysqld (mysqld 5.6.39) starting as process 693 ...
2018-08-19 11:57:13 693 [Note] Plugin 'FEDERATED' is disabled.
Default options are read from the following files in the given order:
/etc/my.cnf /etc/mysql/my.cnf /usr/etc/my.cnf ~/.my.cnf
2018-08-19 11:57:13 693 [Note] Binlog end
2018-08-19 11:57:13 693 [Note] Shutting down plugin 'MyISAM'
2018-08-19 11:57:13 693 [Note] Shutting down plugin 'CSV'

innodb_buffer_pool_size

缓存数据块和索引块,对InnoDB表性能影响最大。如果数据库中只有Innodb表,则推荐配置量为总内存的70%~80%。

innodb_log_buffer_size

InnoDB存储引擎的事务日志所使用的缓冲区,InnoDB在事务提交前,并不将改变的日志写入到磁盘中,因此在大事务中,可以减轻磁盘I/O的压力。通常情况下,如果不是写入大量的超大二进制数据(a lot of huge blobs),4MB-8MB已经足够了.

innodb_buffer_pool_instance

InnoDB1.1和MySQL5.5中介绍了多Innodb缓冲池。5.5中这个值默认大小是1,而5.6中是8。这个参数的取值范围是1-64。在高并发的任务中允许使用innodb_buffer_pool_instances会非常有效,因为它能够减少全局互斥锁(global mutexes)的存在。

innodb_flush_log_at_trx_commit

关键参数,对innodb 的I/O影响很大。这个值设为1时,将会在每次日志提交时,将日志缓冲(log buffer)中的内容刷入硬盘,以确保数据最大限度的完整性,当然这样也会对性能带来影响。如果设为2,表示每次日志提交时,仅仅将日志缓冲中的内容刷入操作系统的文件缓存。如果你对ACID不那么关注,并且对于OS崩溃前最后一两秒的事务丢失不那么在意的话,设为2将带来更好的性能。

0:每隔1s中才将事务提交的变更记录刷新到磁盘
1:每一次事务提交都把变更日志刷新到磁盘(最安全的方式)
2:每一次提交将日志刷新到缓冲区,隔1s之后会将日志刷新到磁盘。

innodb_file_per_table

off 为共享表空间 on独立表空间 参考链接

max_user_connections,max_connections

限制系统的最大连接数以及个人的最大连接数

系统配置

1.tcp_max_syn_backlog
2.tcp_max_tw_buckets
3.tcp_tw_recycle
4.tcp_fin_timeout

3.数据库表结构以及架构设计

1.合理的设置表的字段类型以及长度
2.合理设计表的结构
3.表的拆分:垂直拆分,水平拆分
4.读写分离

4.SQL语句以及索引优化

1. 不要select *
2. 合理设计表的索引等等

参考文章:

innodb_buffer_pool_size

MySQL 大表优化方案tisQ)