MySQL优化的想法
写代码写多了有时候真的很乱。
于是换换心情鼓捣MySQL优化的东西,纯粹是自己现在的想法和观点。而且这里仅仅是出于MySQL配置着手,事实上,构建一个合理的数据表结构以及建立合理的索引键也是非常重要的,但,这里是在表结构都是比较完美的条件下对配置文件进行调整方面的。同时,数据表使用MyISAM结构。
MyISAM表个人觉得有几个参数:
key_buffer_size,query_cache_size,table_cache
对于性能影响很大。
首先是key_buffer_size,这个是设置数据索引缓存区的大小的。从这个意思上就大体明白他的作用了。大量的数据是靠索引进行快速检索的,而索引利用的好与坏就取决于这个参数的设置。那么如何判断这个参数设置是否合理呢?第一,这个参数的意思就很明确了它是索引的缓存区,所以大的值至少应该是数据库中所有数据表索引容量的大小即所有数据库中所有的*.MYI的大小总和,在不确定什么值是比较合适的,那么设置这个值应该是最保守的了。当然随着数据量增加索引的容量也势必会增加,因此我觉得应该将这个值设置当前所有索引文件总量的1.5倍为好如果内存很大甚至可以设置为2~2.5倍。设置完毕重起服务生效后。可以通过mysql运行状态中的两个值来判断设置的是否合理,这两个参数值是:Key_read_requests和Key_reads,一般认为Key_read_requests的值应该至少是Key_reads的100倍左右,这样才能达到好的性能,如果能达到1000倍以上那就更好了。
其次是query_cache_size,这个是设置查询缓存区容量大小的。这个参数设置是从mysql4.01开始使用的。按照官方手册的说法,设置这个可以带来查询缓冲最多达到238%的效率。这个参数可以通过观察几个mysql运行状态变量来进行调整。如果Qcache_lowmem_prunes很大(在phpmyadmin中的表征是红色字体)并且Qcache_hits也很大,说明数据库进行重复查询很多这个时候,你就应该考虑加大query_cache_size的值了。假如Qcache_hits比较小,这就说明数据库进行重复查询的次数比较少,根据手册说,加大query_cache_size的值意义不大了,甚至可以不使用query_cache_size。
最后是table_cache,这个是指定表高速缓存的大小的。在mysql运行状态中,如果发现open_tables等于table_cache,并且opened_tables在不断增长,那么这个时候就应该考虑增加table_cache值了,不过,并不是说table_cache一定要设置得非常大,太离谱的大有可能会导致查询失败或者整体稳定性降低。根据好多人的经验,对于1G内存可以考虑设置为256。
其实除了上面三个参数外,还有几个参数也比较有用。
比如,max_connections。这个是设置mysql最大连接数的,之前看过很多人的机器,发现这个值设置的都很大。其实这个值不用设置太大,够用就行,因为每增加一个连接数都要成倍的占用内存。一般可以长期运行mysql后查看mysql的运行信息,看看最高的连接数(max. concurrent connections)是多少,比这个值高一点就行,mysql默认是100其实绝大多数的网站都够用了。我的建议是不妨设置为100甚至再小一点(比如60),然后将wait_timeout设置为10或者6左右,最后不要将你的程序使用持久链接(pconnect)除非你确认网站的访问量不高。这样设置后一般会节省很多服务器开销同时还不会造成mysql连接数过多的情况。
还有一个参数thread_concurrency,是允许mysql使用的进程数的设置,一般是设置为CPU数*2,不过说实话也许这个表面上体现不过或者涉及到的实在太底层了,我没发现这个参数有什么出彩的地方,呵呵。不过,看这个参数的表面意思,应该可以理解为多进程处理吧,呵呵。
最后就是说到Innodb,这个是可以支持事务的——是手册说的,不过我做PHP真的没发现这个有什么好的。反倒觉得把他关闭了,数据库打开表的速度会快了n倍,哈哈。所以,如果你的数据库中没有Innodb类型建的表的话,我觉得还是关闭了好一些(skip-innodb),毕竟即便不会提高性能和速度至少也不会白白浪费资源嘛,反正没用不如干脆就禁止掉,只要在配置文件中加入一个skip-innodb就OK了!
上面就是我的个人经验,不一定对,呵呵。
这里其实没有给出具体的数值,不单单是因为硬件的缘故,最重要的也是大家运行的数据量也不同。理解上面的设置理论后,只要利用phpMyAdmin中的运行状态就可以看到各个参数设置是否合理是否有需要改进的地方。因此MySQL优化并不是一个一路通的情形,而是根据数据量、硬件环境、访问量等等密切相关的。先根据情况大体设置一个参数值,然后再若干小时后看看运行情况是否有需要改动的,然后再运行1天甚至几天以后再观察,如此反复才能调整出一个比较适合你自己的数据库的合理的参数了!
上面的理论非原创,但文字的确是自己写的。^_^
标签:MySQL, 服务器