我很惊讶,我现在已经看不到这个网站上的任何答案,也没有在MySQL文档中看到( 5.2节似乎已经logging在其他文档中)。
如果启用二进制日志,我会看到一个小的性能问题(主观上),这是预期的一点额外的IO – 但是当我启用一个普通的查询日志,我看到巨大的性能影响(运行查询的时间增加了一倍,或者更糟糕),超出了我用binlogs看到的方式。 当然,我现在正在logging每个SELECT以及每个UPDATE / INSERT,但是,其他的守护进程logging他们的每个请求(Apache,Exim)而不停顿。
我刚刚看到IO接近性能“转折点”的效果,或者是否有根本上困难的日志查询导致这种情况发生? 我希望能够logging所有的查询,使开发更容易,但我不能certificate这种硬件感觉就像我们需要通过一般的查询login来获得性能。
我当然会logging缓慢的查询,如果我禁用这个,一般用法的改进是微不足道的。
(所有这些都在Ubuntu 10.04 LTS,MySQLd 5.1.49上,但研究表明这是一个相当普遍的问题)
一般查询日志比二进制日志多得多。 除了大多数SQL服务器从90%读取到10%写入的事实之外,二进制日志以二进制格式存储,而不是使用较less磁盘空间的纯文本。 (多less空间?我不确定,对不起)
为什么Apache和Exim可以logging每个请求而没有显着的性能影响呢? 首先,他们logging了一个请求发生的事实,但是他们放在日志中的事实通常比实际请求要小得多。 HTTP请求通常是日志中的行的两倍,甚至短的纯文本电子邮件比它所附带的日志行大10或20倍。 具有10MB附件的电子邮件仍然只有几行写在日志中。
第二部分是在一个普通的Web应用程序中,通常有几十个与单个HTTP页面相关的SQL查询。 电子邮件往往比HTTP请求数量更less。 你的MySQL服务器可能试图logging比Apache或Exim更多的日志。
看看你的MySQL二进制和一般日志以及Apache和Exim日志的大小(未压缩)。 我敢打赌,你发现MySQL的通用日志是最大的一个因子至less5。
要添加到提供的答案中 ,如果您正在login到您的MySQL数据存储所在的同一设备上,您也将看到性能问题 – 如果它是相同的磁盘,那么您将要读取和写入多个位置一直放慢整个过程。
即使它是同一物理磁盘上的不同分区也是如此。
如果将日志logging到其他设备,则应该可以缓解一些性能问题。