优化PHP <> MySQL性能

我正试图在这个testing脚本上优化我的PHP <> MySQL:

<? for($i=0;$i<100;$i++)//Iterations count $res.= var_dump(loadRow("select body_ru from articles where id>$i*50 limit 100")); print_r($res); ?> 

我有APC,文章表有id的索引。 而且,所有这些查询都打到查询caching,所以如果MySQL性能很好的话。

但是当我用ab -c 10 -t 10来replace这个脚本时,我得到了:

100次迭代:〜100req /秒(〜10'000次MySQL查询)

5次迭代:〜200req /秒

1次迭代:〜380req /秒

0迭代:〜580req /秒

我试图禁用PHP中的持久连接 – 它使它慢一点。 那么,如果MySQL不限制性能,我怎么才能让它工作得更快呢?

所以这看起来像build立连接或其他东西是花费太多的时间…

mysql_pconnect会更快,但是,正在消失(我不相信它甚至被mysqli支持)。 持续连接删除连接/拆卸时间。

你的mysql通过TCP或套接字连接吗? 如果TCP,是压缩还是SSL打开? 当你期待更大的响应时,压缩是很好的,但是在小的响应上,你会花费更多的CPU时间压缩/解压双方。 你想要使用约99%的时间压缩。 PHP和MySQL之间的SSL连接将是确定的性能障碍。

如果你通过TCP连接,mysql中的skip-name-resolve会加速一些事情。 那么就需要在你的拨款中使用一个IP而不是一个域名。

但是,您认为这些查询可能在caching中的假设取决于caching的大小和结果集的大小。 如果您的查询平均每个结果集为400k(假设文章长度为4k),则至less需要一个40mb的查询caching来caching内容。 如果您要发回任何整数字段,请记住libmysqlclient库将整数转换为ascii,然后PHP在收到结果时必须将其转换为任何数据types。

mysql_fetch_assoc比mysql_fetch_row慢了一点,但是还不够,你会觉得值得转换你的代码来使用它。

我相信你可能会遇到连接到mysql服务器的问题。 如果您使用的是TCP,那么您将要进行一些更改。 如果你使用套接字连接,那么你可能无法调整更多的性能。

@pQd,根据我的经验,我发现在索引查询的限制子句上的查询优化器将从索引中得到回答,并且使用范围索引不会在结果中提供太多的改变。 范围查询也不会考虑后来被删除的文章ID,这会导致分页。 第100-150条,如果这些条款中的20条被删除,则会返回30行,这可能无法正确填充页面。 数据呈现的限制条款通常是正确的。 只有当你使用sql_count_rows这是另一个有用的分页工具时,mysql才会完成整个查询。 您要确保您正在回答索引中的这些查询以防止桌面扫描。

是的,我知道你说,MySQL是不是限制因素,但无论如何试试这个:

 <? for($i=0;$i<100;$i++){ $down = $i*50; $up = ($i+1)*50; print_r(var_dump(loadRow("select body_ru from articles where id>$down and $id<=$up ")); } ?> 

mysql以奇怪的方式处理限制…它将生成整个结果,然后只发送前n行到客户端。 所以从上边界和下边界过滤id。

略微更多的stackoverflow – ish部分:

该代码不是你的100%相同 – 在你的情况下,你一直在接收重叠的块。

什么是内部loadRow – 它使用mysqli? MySQL的? 像adodb一些抽象? 如果您调整性能跳过adodb-like图书馆。

也 – 我会比查询caching更信任innodb_buffer_pool。

请让我们知道提议的变更如何影响性能。