我不会过多担心 mysql 查询的连接开销,特别是如果您没有关闭每个查询之间的连接。考虑一下,如果您的查询创建了一个临时表,那么您在查询中花费的时间已经超过了查询的开销。
我个人喜欢执行复杂的 SQL 查询,但我发现表的大小、mysql 查询缓存和需要进行范围检查(甚至针对索引)的查询的查询性能都会产生影响。
我建议这样做:
1)建立简单、正确的基线。我怀疑这是不计其数的查询方法。这没有错,而且很可能是完全正确的。运行几次并观察您的查询缓存和应用程序性能。保持您的应用程序可维护的能力非常重要,特别是如果您与其他代码维护者一起工作。此外,如果您要查询非常大的表,小查询将保持可伸缩性。
2)对复杂查询进行编码。比较结果的准确性,然后比较时间。然后在查询上使用 EXPECT 来查看扫描的行是什么。我经常发现,如果我有一个 JOIN、一个 WHERE x != y 或一个创建临时表的条件,查询性能可能会变得非常糟糕,特别是如果我在一个总是在更新的表中。但是,我还发现复杂查询可能不正确,而且随着应用程序的增长,复杂查询更容易中断。复杂查询通常会扫描更大的行集,通常会创建临时表并调用using where
扫描。桌子越大,这些东西就越贵。此外,您可能会考虑复杂查询不适合您团队的优势的团队。
3) 与您的团队分享结果。
复杂查询不太可能命中 mysql 查询缓存,如果它们足够大,就不要缓存它们。(您希望为频繁命中的查询保存 mysql 查询缓存。)此外,必须扫描索引的查询 where 谓词也不会那么好。(x != y, x > y, x < y)。诸如SELECT foo, bar FROM users WHERE foo != 'g' and mumble < '360'
最终进行扫描之类的查询。(在这种情况下,查询开销的成本可以忽略不计。)
只需从索引中获取所有值,通常无需创建临时表即可完成小型查询,只要您选择和预测的字段都已编入索引。所以查询性能SELECT foo, bar FROM users WHERE id = x
非常好(特别是如果列foo
和bar
被索引,又名alter table users add index ix_a ( foo, bar );
。)
提高应用程序性能的其他好方法是将这些小查询结果缓存在应用程序中(如果合适),或者执行物化视图查询的批处理作业。此外,请考虑 memcached 或 XCache 中的一些功能。