|
网站的MySQL数据库大约1G(预计增长最大不超过1.5G),SELECT占95%以上,UPDATE和INSERT基本上没有。服务器的内存很大,有4G,然而要命的是只有一个7200转的SATA硬盘,并且不支持NCQ功能,一遇到多个并发查询时就慢的像蜗牛!
我有个不增加任何投资的改善性能的想法,大家看看如何实现?
专门划出1.5G内存来建立一个data目录的镜象,读取时只从内存中读取(不访问硬盘),写入时同时更新内存和硬盘,这样硬盘就变成一个“只写”存储器。
由于写操作很少,这样可以有效的避免硬盘操作从而提高效率,而剩余的2.5G内存也不算小。
大家说说看这个如何实现呢?
问题的关键在于如何保证读取的时候只访问内存,而写入的时候同时更新内存和硬盘。
不用ShareMemery和RamDisk的原因在于不能保证实时刷新硬盘,这样万一掉电的话,就要哭死了~
================
补充说明
================
query-cache的用处不大,因为想要这样做最初的一个原因是受到了sql查询攻击,攻击者利用网站在用户注册时必须遍历库以确定是否有重复的用户名,然后不停的提交随机生成的用户名进行查询,这样每次查询的语句都不一样,所以query-cache再大也没有用,硬盘还得拼命的转~
当然也可以通过建立索引来避免遍历,但这里只是为了说明问题而举的例子,因为某些查询始终是无法避免遍历的,比如提取大于平均值的记录。
这个想法的本意是在用内存的高速度代替硬盘的低速度,同时又要有较强的抗风险能力[掉电或内存崩溃时丢失的数据不会超过崩溃前的2秒]
================
一种可能的实现
================
为每张表建立两个版本,一个放在硬盘上(innoDB),一个放在内存里(HEAP)。
修改程序,使SELECT仅操作HEAP表,UPDATE和INSERT同时操作innoDB和HEAP表。
评价:麻烦,需要大量修改现有程序!
================
有没有更好的实现方案呢?各路英雄豪杰,请踊跃发言!
比如从操作系统层着手,或者使用其他技术? |
|