Учитывая, что db_select намного медленнее, чем db_query, зачем мне его использовать?

Подробнее об этом см. http://drupal.org/node/1067802 .

Учитывая все это, какие ситуации существуют, где я могу использовать db_select (), или я должен полагаться исключительно на db_query?

70 голосов | спросил Chris Cohen 23 MarpmWed, 23 Mar 2011 12:42:53 +03002011-03-23T12:42:53+03:0012 2011, 12:42:53

3 ответа


87

Существует 5 причин использовать SelectQuery

  • Вы создаете динамические запросы с различным количеством условий, объединений, полей и т. д. См. field_read_fields () для примера.

  • Вы хотите использовать так называемые Расширители . Примерами расширения являются PagerDefault (заменяет pager_query () ) и TableSort (заменяет tablesort_sql () ). Они позволяют добавлять дополнительные функции в SelectQuery. См. Также Как сделать сортируемые таблицы с пейджером с данными из пользовательской таблицы? . Пример: node_page_default () .

  • Вы хотите разрешить другим модулям изменять ваши запросы. Затем вы можете добавить так называемый теги и SelectQuery автоматически вызовет соответствующий перекрестный крючок для этого тега. Я сильно полагаюсь на это с помощью моего модуля Privatemsg (мы уже сделали это в D6 с помощью настраиваемого построителя запросов).

  • Если вам нужно /нужно использовать систему node_access, чтобы показывать только узлы, которые пользователь может видеть. Просто добавьте тег 'node_access' в ваш $ query. Это заменяет db_rewrite_sql ().

  • В SelectQuery есть несколько функций, которые помогают сделать ваш код одинаковым для всех поддерживаемых баз данных. Например, есть SelectQuery: : orderRandom () . И если у вас есть условие LIKE, -> условие ('field', $ value, LIKE), убедитесь, что это всегда нечувствительное к регистру сравнение. В D6 вам пришлось использовать LOWER () для того, что было намного медленнее. Но AFAIK, сейчас их не больше двух.

Если ни одна из этих причин не применяется для конкретного случая, используйте db_query ().

ответил Berdir 23 MarpmWed, 23 Mar 2011 13:37:53 +03002011-03-23T13:37:53+03:0001 2011, 13:37:53
9

документация о db_query() говорит:

  

Используйте эту функцию для запросов SELECT, если это просто простая строка запроса. Если вызывающему или другим модулям необходимо изменить запрос, используйте вместо него db_select ().

ответил marcvangend 23 MarpmWed, 23 Mar 2011 13:08:51 +03002011-03-23T13:08:51+03:0001 2011, 13:08:51
9

Я всегда использую db_select, поскольку я предпочитаю читаемость, поддержку и кросс-совместимость баз данных с небольшим приростом производительности. Более того, я думаю, что цифры, приведенные в упомянутой проблеме, приводят неверный образ общей производительности. Мы говорим о разнице в 300 микросекунд в запросе, который при возвращении более одного столбца часто запускается в многомиллисекундном диапазоне. И я не удивлюсь, если есть только однократные накладные расходы (загрузка класса) и, следовательно, различия в полном запросе (странице) намного меньше.

ответил fietserwin 11 J000000Wednesday12 2012, 00:30:03

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132