目前在捣鼓一个小型的互联网项目,从项目开始到现在,mysql一直是系统性能的瓶颈。我之前没有很系统的接触过或仔细的研究过mysql,一直都是遇到问题,解决问题,也不知道是否会给后期项目带来什么风险。我分享几次调优的经验,希望版主以及达人们能够给点建议。第一阶段:
这个阶段表的数据量还不算很大,只是有个别的表开始超过百万,这时候的瓶颈主要体现sql上
解决方法:我写了个shell,作为mysql的性能监控。当cpu超标时,记录正在执行的sql。同时分析数据库慢查询日志。针对速度可能会慢的sql,挨个排查。有些是由于索引引起,有些将业务逻辑简化,有些将表关联打散,有些做冗余表。第二阶段: 
这个阶段表的数据量扩展了一个数量级,特别是几个主表【用户表】、【动态表】、【用户关系表】等,都达到了百万级的数据量,经常性出现sql locked的情况,已经不是单个sql的问题 
解决方法:再多次优化sql无果的情况下,我将几个大表的类型都从myisam改成了innoDB,将表锁改成行锁。现在的问题:
这个项目对数据的完整性要求不是很严格,所以不需要实现事务。看网上的几个帖子都说:当需要事务的时候才用的上innoDB,其他时候还是myisam性能更高。我想请教如何在myisam的基础上,尽可能的支持高并发,这是数据库层面的问题,还是业务逻辑的问题?@ACMAIN_CHM  

解决方案 »

  1.   

    网上有很多错误的帖子误导别人   所以在全面了解innodb以后就会没理由不选择他了  全面抛弃myisam吧
      

  2.   

    另外监控用线程的工具要比你自己写脚本完美的多单单看个cpu和没监控差不错
      

  3.   

    你的这样情况,还是应该使用INNODB, INNODB在访问性能上不如MYISQM,但支持行锁。
      

  4.   

    INNODB性能不如MYisam,但INNODB支持行锁的。
      

  5.   

    就我个人理解,关于数据库的优化,其实是分很多方面来说的,首先,假设你在SQL上的优化已经无可挑剔,业务方面也做得尽量简单,那么你可以考虑做这样几个事。
    减轻单表压力:
    1.在你原来表的基础上启用分区表,或者分表,把表按照ID取HASH到几张表示,减小lock table的概率,可在原来的代码层下加一个逻辑层专门完成这个任务
    2.根据项目读写负载,适当增加Slave服务器,并且按照业务区分不同从服务器的功能,最大可能利用缓存。
    减轻整体数据库压力:
    3.把不同的功能分布到不同的服务器上,每个数据库服务器只针对一个功能
    4.尽量使用缓存,一层一层减轻数据库压力,能延时更新的就延时更新,从业务上减轻压力
    PS:
    1.Mysql官方有说明,我自己也做过测试,Innodb表的运行速度和MyIsam的速度差不多,而且Innodb在数据的安全性上要比Myisam好一些,高并发Update情况下,Innodb的表现较好,一般不会锁住整张表,Select的表现两者相当
    2.如果表设计的合理,理论上来说,现在的服务器配置,单表1亿左右是没有问题的,实际操作的时候,个人经验1KW左右是个比较合理的范围(相对于维护,备份等工作)尼玛,老子从来没写过这么多字
      

  6.   

    多谢楼上的各位,看来还是实践出真知啊!最初我还很担心,换成Innodb之后会给系统带来其他的问题呢。
    特别感谢:@zhangzr1026的建议,你提到的几点可能就是我下个阶段决解瓶颈的方案了。:)
      

  7.   

    再次看到了kw这个缩写。这个缩写我知道是千万的意思,但我不知道k和w分别是哪两个缩写。有人告诉我,k是英文单词kilo前缀,代表千,  w是万的意思, 除了是汉语拼音外,我想不到其他解释。求解?