配置MySQL服务器离不开配置文件,接下来就开始这一部分的内容。
首先一定要清楚配置文件的位置,如果不知道可以尝试下面的操作:
/usr/local/mysql/bin/mysqld --verbose --help | grep -A 1 'Default options'
#结果如下
Default options are read from the following files in the given order:
/etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf ~/.my.cnf
有时候可以使用show global status 的输出来看状态,有的时候也需要看随着时间的变化而变化的状态值,可以使用命令:
/usr/local/mysql/bin/mysqladmin extended-status -ri60 -uroot -p123456
接下来看看内存的配置使用了。
MySQL可以使用的内存会受到操作系统位数的限制,MySQL保持一个连接(线程)只需要少量的内存,同时也需要为高峰时期执行大量查询预留好足够的内存。
下面是我们认为比较重要的缓存:
a、InnoDB缓冲池
b、InnoDB日志文件和MyISAM数据的操作系统缓存
c、MyISAM键缓存
d、查询缓存
InnoDB缓冲池并不仅仅缓存索引,还会缓存行的数据,自适应哈希索引,插入缓冲,锁,以及其他内部数据结构。很大的缓冲池,预热和关闭都很话费很长时间,重启服务器也会话费很长的时间,尤其是磁盘很慢的时候,可以使用Percona Server的快速预热功能,如果不能使用可以在重启时立刻进行全表扫描或者索引扫描,把索引载入缓冲池。可以通过使用init_file设置来实现这个功能。
如果大部分表都是MySIAM表,就应该为键缓存分配比较多的内存。最重要的配置是key_buffer_size,在决定键缓存需要分配多少内存之前,需要先了解MySIAM索引实际占用多少空间。查询INFORMATION_SCHEM表的INDEX_LENGTH字段,把他们的值相加就可以得到索引占用空间。如下:
linux下也可以使用如下命令:
du -sch `find /path/to/mysql/data/directory/ -name "*.MYI"`
默认情况下,MySIAM将所有索引都缓存在默认的键缓存中,但也可以创建多个命名的键,可以在配置文件中添加如下
key_buffer_1.key_buffer_size=1G
key_buffer_2.key_buffer_size=1G
可以使用cache index 命令来将表映射到对应的缓冲区,比如下面的语句,使用key_buffer_1来缓存t1和t2表的索引
cache index t1,t2 in key_buffer_1;
也可以把表的索引预载入缓存中,如下命令:
load index into cache t1,t2;
即使全部是InnoDB表,没有MySIAM表,依然需要将key_buffer_size设置为一个较小的值,因为服务器有时会在内部使用MySIAM,例如GROUP BY语句可能会使用MySIAM作为临时表。
线程缓存保存那些当前没有连接但是准备为后面的连接服务的线程,thread_cache_size变量指定了MySQL可以保持在缓存中的线程数。
一个好的办法是观察Threads_connected变量并且尝试thread_cache_size,没有必要设置的非常大。
InnoDB有自己的表缓存,可以称为数据字典,当InnoDB打开一个表就增加了一个对应的对象到数据字典,当表关闭的时候也不会从数据字典移除。
另一个性能问题是第一次打开表会计算统计信息,这需要很多的I/O操作,相比MySIAM,InnoDB没有将统计信息持久化,而是在每次打开时重新计算,包括改变表的内容或者查询INFORMATION_SCHEMA表也会重新计算统计信息,如果有很多表,服务器可能会花费数个小时来启动并完成预热。MySQL5.6以后,可以通过innodb_analyze_is_persistent选项来持久化存储统计信息到磁盘上。
可以关闭innodb_stats_on_metadata选项来避免耗时的表统计信息的刷新。
本文出自 “phper-每天一点点~” 博客,请务必保留此出处http://janephp.blog.51cto.com/4439680/1320197