阅读 183

MySql(参数)性能的优化

MySql(参数)性能的优化

MySql查询写入贼慢?

在前几天,在测试中遇到了一个这样的问题。 现象为:查询和写入都相当的慢

说出来可能都不信,慢到哪种地步呢?

select count(1) from table_name
复制代码

这样一句简单的sql,单表(不超过15个字段)数据12w,竟然查询长达27s。

查看了一番资源使用情况之后,资源的占用没有哪项被占用的特别厉害。

遂查看mysql的日志文件,发现几乎查询都很慢。

最开始并没有把问题的根源放在mysql的配置上,是因为,在我们应用中mysql 的写入其实挺大的,总以为是写入导致的,查看代码,优化sql,但是做完这些发现几乎没什么变化。


经过一番折腾之后,也没解决问题,在最后,矛头指向了my.ini配置文件。

发现my.ini的配置极不合理。(我们所有的表都用的是InnoDB引擎。)

InnoDB部分参数修改如下:

  • innodb_buffer_pool_size

    8M->4G

  • innodb_thread_concurrency

    6->12

修改之后不能启动?

然后重启Mysql发现无法启动。。。。。。佛了。

默默又打开了百度。

发现 my.ini 编码必须是ANSI,而记事本默认保存不是ANSI编码,导致无法启动。

编码改了之后,终于可以启动了。

欣喜的执行了原来的sql,看了看执行时间 0.27s,多么令人激动的一个数字,MySql它正常了。


参数解释

现在虽然是改了,但似乎并不知道参数意味着什么,now ,来看看参数的意思:

innodb_buffer_pool_size

这个缓冲池是用来存储 索引和行数据的设置得越大,访问表中数据所需的磁盘I/O就越少在专属mysql服务器上,你可以将这个值设置到物理内存的80%,不要设置的太大,太大会导致产生Paging File注意,在32位系统上,每个进程的用户级内存限制在2-3.5G,因此不要设置得太高。

innodb_thread_concurrency

InnoDB内核中允许的线程数,这个值取决于,硬件,应用,OS scheduler properties,设置的太高会线程上下文切换频繁,降低效率,所以不要设置的太高。推荐4核4线程(4C4T)值设置为4-8即可,最大不建议超过线程数*2

如果您对其他的MySql的优化很感兴趣,请参阅以下资料

来源Mysql官网手册:Mysql Optimizing

优化InnoDB磁盘I/O:Optimizing InnoDB Disk I/O

InnoDB的配置--并发线程: Configuring Thread Concurrency for InnoDB