鉴于db_select比db_query慢得多,我为什么要使用它?


Answers:


88

使用SelectQuery的5个理由

  • 您正在建立具有各种条件,联接,字段等的动态查询。有关示例,请参见field_read_fields()

  • 您想使用所谓的Extenders。示例扩展程序是PagerDefault(代替pager_query())和TableSort(代替tablesort_sql())。这些允许向SelectQuery添加其他功能。另请参阅如何使用来自自定义表的数据用分页器制作可排序的表?。例如:node_page_default()

  • 您想允许其他模块更改您的查询。然后,您可以添加所谓的标签,并且SelectQuery将自动为该标签调用相应的alter hook。我在Privatemsg模块中高度依赖此功能(我们已经在D6中使用自定义查询生成器完成了此操作)。

  • 如果您希望/需要使用node_access系统仅显示节点,则允许用户查看。只需将'node_access'标记添加到您的$ query中即可。这将替换db_rewrite_sql()。

  • SelectQuery具有一些功能,可帮助使您的代码在所有受支持的数据库中均相同。例如,存在SelectQuery :: orderRandom()。如果您有LIKE条件,-> condition('field',$ value,'LIKE')将确保它始终是不区分大小写的比较。在D6中,您必须使用LOWER()来完成慢得多的操作。但是AFAIK,目前只有两个。

如果这些原因均不适用于特定情况,请使用db_query()。


1
添加了第五点,数据库可移植性功能,例如orderRandom()和不区分大小写的LIKE。
Berdir 2011年

6
作为第六个原因,我将添加跨数据库兼容性。例如,Oracle查询的语法与MySQL,Postgres等在某些方面有所不同。编写代码从db_select()生成正确的语法要比某些与Oracle不太兼容的查询代码容易得多直接转储到db_query()中。
BrianV 2012年

9

关于的文档db_query()说:

如果它只是一个简单的查询字符串,请将该函数用于SELECT查询。如果调用者或其他模块需要更改查询,请改用db_select()。


谢谢,但是那不是很明确。它使“简单查询字符串”的定义易于解释。如果要在具有6个联接的4个表中进行选择,那还是一个简单的查询,还是应该使用db_select()来完成?
克里斯·科恩

3
这与“简单查询”无关,而与“简单查询字符串 ”有关,简单实际上意味着硬编码而不是动态的。请参阅我的答案以获取更多详细信息:)
Berdir 2011年

9

我总是使用db_select,因为我倾向于提高可读性,可维护性和跨数据库兼容性,而不是提高性能。此外,我认为上述问题给出的数字对整体表现产生了错误的印象。我们说的查询差异为300微秒,当返回多个列时,查询通常在毫秒级范围内运行。而且,如果只有1次开销(类加载),并且整个(页面)请求的差异要小得多,我也不会感到惊讶。


性能差异不是那么简单。请参见比较db_query和db_select性能。我通常建议使用db_query而不是db_select,除非您需要Berdir答案中提到的特殊功能之一。
geerlingguy 2014年
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.