MySQL5.7 优化

为什么要优化?

1、系统的吞吐量瓶颈往往出现在数据库的访问速度上

2、随着应用程序的运行,数据库的中的数据会越来越多,处理时间会相应变慢

3、数据是存放在磁盘上的,读写速度无法和内存相比

4、数据库表设计者在建表的时候设计水平一般。

如何优化?

选择数据库引擎:

如果没有特别的需求或者一般来说,使用默认的Innodb即可。

MyISAM:以读写插入为主的应用程序,比如博客系统、新闻门户网站。

Innodb:更新(删除)操作频率也高,或者要保证数据的完整性;并发量高,支持事务和外键保证数据完整性。比如OA自动化办公系统。

1、innodb 缓存池官方推荐功能参数的设置:

innodb 缓存池:InnoDB 缓冲池是一个内存区域,用于保存表,索引和其他辅助缓冲区的缓存 InnoDB 数据。

为了提高大容量读取操作的效率,缓冲池分为 pages ,可以容纳多行。为了提高缓存管理的效率,缓冲池被实现为链接的页面列表;

使用 LRU 算法的变体,很少使用的数据会在缓存中老化。(重要:如何设置缓存数据老化的时间)

如何设置innodb 缓存池的个数和大小:

innodb_buffer_pool_size = innodb_buffer_pool_chunk_size * innodb_buffer_pool_instance_size

innodb_buffer_pool_chunk_size = 128M (默认大小) (InnoDB缓冲池块大小)(重要!不要随意修改)

innodb_buffer_pool_instance_size = 1 (默认个数)(innodb缓存池个数)(不能超过1000个)

官方推荐:innodb_buffer_pool_size = memory 50%-75%

 查看语句:

mysql> SELECT @@innodb_buffer_pool_chunk_size;

mysql> SELECT @@innodb_buffer_pool_instances;

 

mysql> SELECT @@innodb_buffer_pool_size;

2、key_buffer_size 缓存:

所有线程共享 MyISAM 键缓冲区。该 key_buffer_size 系统变量确定其大小。

key_buffer_size指定索引缓冲区的大小,它决定索引处理的速度,尤其是索引读的速度。

key_buffer_size只对MyISAM表起作用。但即使你不使用MyISAM表,内部的临时磁盘表是MyISAM表,也要使用该值。

对于1G内存的机器,如果不使用MyISAM表,推荐值是16M(8-64M)。

key_cache_miss_rate = Key_reads / Key_read_requests * 100% (从内存找不到去磁盘找到数据,比例越小越好)

key_cache_miss_rate = 设置最小值

Key_read_requests = 从缓存读取索引的请求次数。

Key_reads | 6798830 = 从磁盘读取索引的请求次数。

如果Key_reads太大既在内存找数据失败率太大,则应该把key_buffer_size变大

可以设置key_buffer_size = 64M 根据key_reads的值调整。

key_buffer的大小不能超过4G,如果设置超过4G,就有可能遇到下面3个bug:

http://bugs.mysql.com/bug.php?id=29446

http://bugs.mysql.com/bug.php?id=29419

http://bugs.mysql.com/bug.php?id=5731

有些摘取于网上,如有侵权联删,谢谢。