是否有具有一个SELECT foo, bar, FROM users查询,返回500行和500个SELECT foo, bar, FROM users WHERE id = x查询来一次全部之间的明显的性能差异?

在PHP应用程序我写,我试图代码字迹清晰,可读部会产生约500 SELECT语句之间进行选择;或在一个不起眼的,复杂的方式,将只使用一个SELECT返回500行写它。

我宁愿使用清晰,可维护的代码的方式,但我担心的是每个SELECT的连接开销会导致性能问题。

背景信息,如果它是相关的: 1)这是一个Drupal模块,编码在PHP 2)有问题的表,可能得到很少的插入和更新,很少被锁定 3)SQL连接是不可能的问题

不相关的原因

谢谢!

有帮助吗?

解决方案

这几乎总是更快地做一个大批量选择和分析在应用程序代码的结果比做的SELECT的巨量一行。我建议你同时实现和轮廓他们,虽然。一直努力,以尽量减少你必须做出假设的数量。

其他提示

我就不会担心MySQL的查询的连接开销太多了,特别是如果你不关闭每个查询之间的连接。想想看,如果你的查询创建临时表,你已经在查询中花更多的时间比查询的开销了。

我喜欢做一个复杂的SQL查询,个人,但我发现,需要做一系列检查(甚至对指数)都有所作为。<表,MySQL查询缓存和查询的查询性能的大小/ p>

我建议这样的:

1)的建立简单,正确基线。我怀疑这是无数的查询的方法。这是没有错的,并且很可能helfully正确。跑了几次,看你的查询缓存和应用程序的性能。让您的应用程序维护的能力是非常重要的,特别是如果你与其他代码维护工作。此外,如果要查询真大表,小查询将保持可扩展性。

2)的代码的复杂的查询。比较的结果的准确性,然后将时间。然后使用期望在查询,看看有什么扫描的行是。我常常发现,如果我有一个JOIN或其中X!= Y,或者创建一个临时表的条件,查询的性能可以得到很糟糕,尤其是当我在那总是得到更新的表。不过,我也发现一个复杂的查询可能是不正确的,而且也是一个复杂的查询可以更容易地打破作为一个应用程序的增长。复杂的查询通常较大扫描行集合,常常创建临时表,并调用using where扫描。表越大,越昂贵的这些得到。此外,您可能有团队的考虑,其中复杂的查询不适合你的团队的优势。

3)与团队共享的结果。

复杂查询不太可能打MySQL查询缓存,并且如果他们足够大,不缓存。 (您想保存MySQL查询缓存频频命中查询。)此外,查询谓词哪里有扫描索引不会做的一样好。 (X!= Y,X> Y,X SELECT foo, bar FROM users WHERE foo != 'g' and mumble < '360'查询最终做扫描。 (查询开销的成本可能是在这种情况下可以忽略不计。)

小查询可以经常不只是从索引中获得的所有值创建临时表,只要领域你选择和断言在完整的索引。所以SELECT foo, bar FROM users WHERE id = x的查询性能真的很大(尤其当列foobar被索引一样,又名alter table users add index ix_a ( foo, bar );。)

其他好的方法来增加您的应用程序的性能是缓存在应用程序中那些小的查询结果(如适用),或者做一个物化视图的查询的批处理作业。另外,还要考虑分布式缓存或在了XCache发现了一些特征。

好像你知道什么是500个id值,那么为什么不这样做:

// Assuming you have already validated that this array contains only integers
// so there is not risk of SQl injection

$ids = join(',' $arrayOfIds);

$sql = "SELECT `foo`, `bar` FROM `users` WHERE `id` IN ($ids)";
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top