2个月前,公司同事给提出一个问题,说是公司的销售订单每翻一页最少要等个4-5秒钟,最长得等十几秒,这对于每天审批订单来说简直就是折磨。好吧,因为这个模块是前离职同事写的,我想的第一个解决方式就是优化代码,但看了几百行代码我放弃了,毕竟是别人写的不好,优化还不如自己在写一套,没几天代码写好了,开始测试,我了个天,一点效果没有,该慢还是慢。唉,无奈还是找度娘吧!一查真的长知识了,很庆幸因这次机会我又丰满了一些羽翼!
首先,我们的项目是二次开发,mysql升级为5.6后,之后新建的数据表引擎都是默认的InnoDB,而之前的数据表引擎都是MyISAM,因为项目中有事务(InnoDB支持事务,MyISAM不支持)需求,肯定是得设置成InnoDB的。下面我将优化过程分享一下:
1、将数据表引擎统一设置为InnoDB;
2、修改InnoDB缓冲池大小:
1)默认值为 16M. 这是最主要的优化选项,因为它指定 InnoDB 使用多少内存来加载数据和索引(data+indexes);
2)针对专用MySQL服务器,建议指定为物理内存的 50-80%这个范围(我这里设置不到内存的50%,mysql会报错);
InnoDB缓冲池大小 = 服务器系统内存 * 50-80%
例如,拥有64GB物理内存的机器,缓存池应该设置为50GB左右.
3)如果将该值设置得更大可能会存在风险,比如没有足够的空闲内存留给操作系统和依赖文件系统缓存的某些MySQL子系统(subsystem),包括二进制日志(binary logs),InnoDB事务日志(transaction logs)等
小知识:
1、缓冲池是主内存中的一个区域,用于在 InnoDB访问时缓存表和索引数据。缓冲池允许直接从内存访问经常使用的数据,从而加快处理速度。在专用服务器上,多达 80% 的物理内存通常分配给缓冲池
。