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