目前在捣鼓一个小型的互联网项目,从项目开始到现在,mysql一直是系统性能的瓶颈。我之前没有很系统的接触过或仔细的研究过mysql,一直都是遇到问题,解决问题,也不知道是否会给后期项目带来什么风险。我分享几次调优的经验,希望版主以及达人们能够给点建议。第一阶段:
这个阶段表的数据量还不算很大,只是有个别的表开始超过百万,这时候的瓶颈主要体现sql上
解决方法:我写了个shell,作为mysql的性能监控。当cpu超标时,记录正在执行的sql。同时分析数据库慢查询日志。针对速度可能会慢的sql,挨个排查。有些是由于索引引起,有些将业务逻辑简化,有些将表关联打散,有些做冗余表。第二阶段:
这个阶段表的数据量扩展了一个数量级,特别是几个主表【用户表】、【动态表】、【用户关系表】等,都达到了百万级的数据量,经常性出现sql locked的情况,已经不是单个sql的问题
解决方法:再多次优化sql无果的情况下,我将几个大表的类型都从myisam改成了innoDB,将表锁改成行锁。现在的问题:
这个项目对数据的完整性要求不是很严格,所以不需要实现事务。看网上的几个帖子都说:当需要事务的时候才用的上innoDB,其他时候还是myisam性能更高。我想请教如何在myisam的基础上,尽可能的支持高并发,这是数据库层面的问题,还是业务逻辑的问题?@ACMAIN_CHM
这个阶段表的数据量还不算很大,只是有个别的表开始超过百万,这时候的瓶颈主要体现sql上
解决方法:我写了个shell,作为mysql的性能监控。当cpu超标时,记录正在执行的sql。同时分析数据库慢查询日志。针对速度可能会慢的sql,挨个排查。有些是由于索引引起,有些将业务逻辑简化,有些将表关联打散,有些做冗余表。第二阶段:
这个阶段表的数据量扩展了一个数量级,特别是几个主表【用户表】、【动态表】、【用户关系表】等,都达到了百万级的数据量,经常性出现sql locked的情况,已经不是单个sql的问题
解决方法:再多次优化sql无果的情况下,我将几个大表的类型都从myisam改成了innoDB,将表锁改成行锁。现在的问题:
这个项目对数据的完整性要求不是很严格,所以不需要实现事务。看网上的几个帖子都说:当需要事务的时候才用的上innoDB,其他时候还是myisam性能更高。我想请教如何在myisam的基础上,尽可能的支持高并发,这是数据库层面的问题,还是业务逻辑的问题?@ACMAIN_CHM
解决方案 »
- mysql数据库所在机器无法启动,如何把数据导出来?
- mysql如何实现connect by with功能?
- 查询未来几天内信息,发提示通知
- mysql 的二进制分发版 的下载链接?
- pgSQL插入语句
- 有没有可能查询mysql数据库一段时间内的读写次数
- 请问如何实施监控JDBC与mysql的连接?
- 求教:MySQL 5.0支持中文数据库名和中文表名吗?
- 我遇到一个问题,就是我现在有一个数据是一天的,现在我想用mysql语言统计一天内相同IP的个数?我该怎么实现,烦请各位大牛指导,最好有完整的代码。
- MYSQL 安装 配置文件如何修改
- mysql 多条记录判断相加减合并一条
- 困扰了我N天的大问题
减轻单表压力:
1.在你原来表的基础上启用分区表,或者分表,把表按照ID取HASH到几张表示,减小lock table的概率,可在原来的代码层下加一个逻辑层专门完成这个任务
2.根据项目读写负载,适当增加Slave服务器,并且按照业务区分不同从服务器的功能,最大可能利用缓存。
减轻整体数据库压力:
3.把不同的功能分布到不同的服务器上,每个数据库服务器只针对一个功能
4.尽量使用缓存,一层一层减轻数据库压力,能延时更新的就延时更新,从业务上减轻压力
PS:
1.Mysql官方有说明,我自己也做过测试,Innodb表的运行速度和MyIsam的速度差不多,而且Innodb在数据的安全性上要比Myisam好一些,高并发Update情况下,Innodb的表现较好,一般不会锁住整张表,Select的表现两者相当
2.如果表设计的合理,理论上来说,现在的服务器配置,单表1亿左右是没有问题的,实际操作的时候,个人经验1KW左右是个比较合理的范围(相对于维护,备份等工作)尼玛,老子从来没写过这么多字
特别感谢:@zhangzr1026的建议,你提到的几点可能就是我下个阶段决解瓶颈的方案了。:)