什么是更快的db_query,db_select或EntityFieldQuery


15

因此,我试图找出更快的db_query,db_select或EntityFieldQuery。目前,我正在使用EntityFieldQuery。我正在抓取大约1600个节点条目。

我意识到这可能会给系统增加负担,所以我只想弄清楚哪个是获取1600个节点的最佳选择。减少几秒钟甚至几毫秒对于我正在构建的应用程序很重要。

预先感谢您的回答。


您了解了吗?
mpdonadio

不明白你的意思。您能详细说明一下吗?
豪尔赫·卡尔德隆

您应该使用什么取决于您要确切执行的操作?如果您可以提供更多详细信息,我们可能会提供帮助。如果运行大量查询,则db_query()是最快的。但是,如果您要使用它来加载实体(entity_load),则可能没有关系,因为在加载1600多个实体时,entity_load会很慢。
donutdan4114 2014年

1
除了查询代码/查询的速度之外,还有更多其他功能。例如,您需要节点访问吗?
rooby

@rooby-是的 我一直使用EntityFieldQuery,但出于我的需要,我必须有权访问节点中的三个自定义字段。但是,下面的答案仍然是最好的答案,因为raf提供了一些不错的建议和数字。这正是我想要的。
豪尔赫·卡尔德隆

Answers:


24

简而言之,回答db_query最快!以下是根据不同问题和来源汇编的一些原因,事实和数据:

通过简单查询该问题,可以得出以下结果:

For simple queries, db_query() is 22% faster than db_select()
For simple queries, db_query() is 124% faster than EFQ
For queries with two joins, db_query() is 29% faster than db_select()

还有这个

db_query():

Total Incl. Wall Time (microsec):   796 microsecs
Total Incl. CPU (microsecs):    0 microsecs
Total Incl. MemUse (bytes): 123,352 bytes
Total Incl. PeakMemUse (bytes): 124,248 bytes
Number of Function Calls:   38

db_select()

Total Incl. Wall Time (microsec):   1,118 microsecs
Total Incl. CPU (microsecs):    0 microsecs
Total Incl. MemUse (bytes): 425,216 bytes
Total Incl. PeakMemUse (bytes): 436,392 bytes
Number of Function Calls:   88

如果您在上面注意到,db_select比db_query进行更多的函数调用并占用更多的内存。

  1. 有关为什么使用db_select的原因,请参见此处
  2. 有关为什么在db_select上使用EntityFieldQuery的原因,请参见此处
  3. 有关db_query和db_select的性能比较,请参见此处

我想选择应该完全根据您的要求。EntityFieldQuery可能较慢,但具有许多优势,例如语法简单,字段存储可插拔,松散耦合等等。


1
这正是我想要的。感谢一群Raf。
豪尔赫·卡尔德隆

1

对于1600个节点,这是一个非常糟糕的主意,不要绕过API并使用EntityFieldQuery。您正在优化错误的内容。


嗨,Chx,请您详细说明。因此,底线需要拉出1600个节点。我已经在使用EntityFieldQuery,所以只是想了解什么坏主意。我发现EntityFieldQuery在某些方面受到限制。到目前为止,没有什么影响我。无论如何,期待听到您的想法。
豪尔赫·卡尔德隆

1

如果仅需要来自所有1600个节点的现场数据,EFQE可能会有所帮助。如果您已经有了EFQ,则应该可以通过查看沙箱页面来确定所需的内容。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.