大家好,通用的MySql优化大作已经拜读不少。但是对于我最近碰到的一个情况,我觉得应该超出了通用的优化范围,请有经验的前辈指点指点。环境如下:
1。表1里面有大约1亿的记录,每天晚上由一个独立的程序向表中添加记录(每天大约插入50万记录,插入期间允许数据库不可用、不可访问),其它时间由web进行读取访问。
2。整个数据库的表不足20张,其余表都类似表1,但是数据量都不大。目前已经进行的优化是,
1,表采用MyISAM引擎,对数据按时间字段进行分区,每月一个分区,web访问时会提供时间字段。
2,去掉了数据库的binlog。我的问题是:
1,是否还有锁的优化,由于是只有特定的时间独占写入数据,其余时间都是只读,如何进一步优化?
2,请教任何其他的优化

解决方案 »

  1.   

    目前已经进行的优化是,
    1,表采用MyISAM引擎,对数据按时间字段进行分区,每月一个分区,web访问时会提供时间字段。
    2,去掉了数据库的binlog。
    (BINLOG仅对insert / update / delete等有效果,如果都是SELECT的话,关不关应该影响不大)我的问题是:
    1,是否还有锁的优化,由于是只有特定的时间独占写入数据,其余时间都是只读,如何进一步优化?
    没有
    2,请教任何其他的优化
    根据常用的查询建立相关索引
      

  2.   

    1,是否还有锁的优化,由于是只有特定的时间独占写入数据,其余时间都是只读,如何进一步优化? 基本没有2,请教任何其他的优化
    建议打开BINLOG,你的本比较大,一旦出问题,恢复困难;
    定期对表进行清理;
    在查询字段上建立适当索引。
      

  3.   

    谢谢楼上的回复。看来binlog还是需要打开。只是之前为了一次性插入大量数据,暂时关闭。以后每天增加数据,还是需要打开binlog。
    如果确实没有针对性的优化,近期结贴。
      

  4.   

    其实你说了一半天,并没有说出你的问题,你说你采取了一些优化措施,但是优化到什么程度了,解决了你的问题了吗?如果解决了就不需要优化了。如果没有解决,现在的问题是什么,是查询速度慢,还是插入更新慢等。问题不明确,什么方案都没有用。
    如果查询慢的话,你可以从多方面检查:
    1.sql语句是否存在查询:
    可以打开slow query log检查,
    2.索引是否查询时生效了。
      

  5.   

    简单。
    搞个主从吧。 主上面用ARCHIVE引擎,从上面用MYISAM或者INNODB引擎。
      

  6.   

     我的问题是:
     1,是否还有锁的优化,由于是只有特定的时间独占写入数据,其余时间都是只读,如何进一步优化?
     答:mysql默认是写锁优先,你可以改成读锁优先,这样可以部分优化select性能。
         用--low-priority-updates启动mysqld。这将给所有更新(修改)一个表的语句以比SELECT语句低的优先级。
     2,请教任何其他的优化。
      答:鉴于楼主的表1的数据很大,可以考虑把表1的分区粒度减少,一个月一个可能有点大,可以考虑每周一个分区。
         另外,检查索引的建立是否合理,在查询中是否恰当的使用了它们。
      

  7.   

    如果楼主的成本预算允许的话,可以考虑使用MySQL簇(集群),是一个高性能和可扩展的解决方案。
      

  8.   

    非常感谢各位兄弟的回复,抱歉竟然过了20多天才结贴。在此也共享一下我优化的经验,大家共同进步。我的测试机器:Intel Q6600 CPU, 8G DDRII, 500G软RAID1。Ubuntu 8.4.1操作系统
    1,在数据按月分区优化存储。
    2,KeyBuffer 2G。在记录数9千万时,采用按月的日期段进行查询(日期字段有索引,其他条件字段类型varchar(24)、无索引),查询可在16秒左右有结果,比不分区情况下提高10-20倍。
    优化的结果基本满意,接下来主要是应用的优化,根据情况建立索引。针对性开通QueryCache。