2008年12月8日星期一

Mysql配置的优化方法

mysql如果是默认配置,肯定发挥不到最好。针对MySQL的原理,数据库安装后针对MyISAM引擎的配置应注意以下几项:

key_buffer_size -- 这对MyISAM表来说非常重要。如果只是使用MyISAM表,可以把它设置为可用内存的 30-40%。当然这是纯数据库服务器的较理想设置。key_buffer_size合理的值取决于索引大小、数据量以及负载,一般数据库里所有的.MYI的大小和就是应该设置的buffer大小。根据实际情况也可以不需要设置非常精确。 key_buffer_size的值最大4G。同时MyISAM表会使用操作系统的缓存来缓存数据,因此需要留出部分内存给它们,很多情况下数据比索引大多了。另外如果.MYI 文件值的和只有 1GB,而 key_buffer 却设置为 4GB 的实在太浪费了。如果你很少使用MyISAM表,那么也应保留默认的key_buffer_size 以适应给予磁盘的临时表索引所需。通过系统状态变量可以查看当前buffer是否合理使用。如Key_reads /Key_read_requests=1/1000左右最合适,至少要1/100以上。可用show status来观察这两个变量。

table_cache -- 因为数据库打开一个表的开销可能很大。例如MyISAM使用.MYI的文件头标志来表示该表正在使用中。这种操作太频繁肯定影响效率,所以通常要加大缓存数量,使得最大限度地缓存打开的表。这个配置需要用到操作系统的资源,比如内存,对当前的硬件配置来说当然不是什么问题了。如果你有200多个表的话,那么设置为 1024 也许比较合适(每个线程都需要打开表),如果连接数比较大那么就加大它的值。因为table_cache与max_connections有关。例如,对于200个并行运行的连接,应该让表的缓存至少有200 * N,这里N是执行查询的一个联接中表的最大数量。

thread_cache_size -- 线程的创建和销毁的开销可能很大,因为每个线程的连接/断开都需要。我通常至少设置为16。如果应用程序中有大量的跳跃并发连接并且status里面的 Threads_Created 的值也比较大,那么我就会加大它的值。它的目的是在通常的操作中无需创建新线程,而用缓存来重新开启连接。1G->8 ;2G->16 3G->32(参考)

query_cache_size -- 如果你的应用程序有大量读,而且没有应用程序级别的缓存,那么这很有用。不要把它设置太大了,因为想要维护它也需要不少开销,这会导致MySQL变慢。通常设置为 32-512Mb。设置完之后最好是跟踪一段时间,查看是否运行良好。在一定的负载压力下,如果缓存命中率太低了,就启用它。Qcache_hits(表示sql查询在缓存中命中的累计次数)低,Qcache_lowmem_prunes(意味着很多缓存因为内存不够而被释放)和Qcache_not_cached(意味着没有用到缓存)高,就可以综合考虑加大它的值。

注意:就像你看到的上面这些全局表量,它们都是依据硬件配置以及不同的存储引擎而不同(以上主要针对MyISAM),但是session变量通常是根据不同的负载来设定的。如果你只有一些简单的查询,那么就无需增加 sort_buffer_size 的值了,尽管你有 64GB 的内存。搞不好也许会降低性能。sort_buffer_size默认2M。很少有人增加该值超过8M。除非有非常频繁,非常复杂的SQL排序语句。

没有评论: