Vì db_select chậm hơn nhiều so với db_query, tại sao tôi lại muốn sử dụng nó?


69

Để biết nền tảng về điều này, vui lòng xem http://drupal.org/node/1067802 .

Với tất cả những điều đó, những tình huống tồn tại mà tôi có thể muốn sử dụng db_select () hoặc tôi chỉ nên dựa vào db_query?

Câu trả lời:


88

Có 5 lý do để sử dụng SelectQuery

  • Bạn đang xây dựng các truy vấn động với số lượng điều kiện, tham gia, trường khác nhau, v.v. Xem trường_read_fields () để biết ví dụ.

  • Bạn muốn sử dụng cái gọi là Extender . Các phần mở rộng ví dụ là PagerDefault (thay thế pager_query () ) và TableSort (thay thế cho bảngort_sql () ). Những thứ này cho phép thêm chức năng bổ sung vào SelectQuery. Xem thêm Làm thế nào để bạn tạo các bảng có thể sắp xếp với một máy nhắn tin có dữ liệu từ một bảng tùy chỉnh? . Một ví dụ: node_page_default () .

  • Bạn muốn cho phép các mô-đun khác thay đổi truy vấn của bạn. Sau đó, bạn có thể thêm các thẻ được gọi là và ChọnQuery sẽ tự động gọi một móc thay đổi tương ứng cho thẻ đó. Tôi đang phụ thuộc rất nhiều vào điều này với mô-đun Privatemsg của mình (Chúng tôi đã làm điều đó trong D6 với trình tạo truy vấn tùy chỉnh).

  • Nếu bạn muốn / cần sử dụng hệ thống node_access để chỉ hiển thị các nút mà người dùng được phép xem. Chỉ cần thêm thẻ 'node_access' vào truy vấn $ của bạn. Điều này thay thế db_rewrite_sql ().

  • SelectQuery có một vài tính năng giúp làm cho mã của bạn hoạt động giống nhau trên tất cả các cơ sở dữ liệu được hỗ trợ. Ví dụ: có ChọnQuery :: orderRandom () . Và nếu bạn có điều kiện THÍCH, -> điều kiện ('trường', $ value, 'THÍCH') sẽ đảm bảo rằng đó luôn là trường hợp so sánh không nhạy cảm. Trong D6, bạn phải sử dụng LOWER () cho tốc độ chậm hơn nhiều. Nhưng AFAIK, không có nhiều hơn hai cái này ngay bây giờ.

Nếu không có lý do nào trong số những lý do này áp dụng cho một trường hợp cụ thể, hãy sử dụng db_query ().


1
Đã thêm điểm thứ năm, các tính năng di động cơ sở dữ liệu như orderRandom () và trường hợp THÍCH không nhạy cảm.
Berdir

6
Như một lý do thứ sáu, tôi sẽ thêm khả năng tương thích cơ sở dữ liệu chéo. Chẳng hạn, các truy vấn của Oracle có cú pháp khác với một số cách so với MySQL, Postgres, v.v. được kết xuất trực tiếp vào db_query ().
BrianV

9

Các tài liệu vềdb_query() nói:

Sử dụng chức năng này cho các truy vấn CHỌN nếu nó chỉ là một chuỗi truy vấn đơn giản. Nếu người gọi hoặc các mô-đun khác cần thay đổi truy vấn, thay vào đó hãy sử dụng db_select ().


Cảm ơn, nhưng điều đó khá đặc biệt. Nó để lại định nghĩa 'chuỗi truy vấn đơn giản' khá mở để giải thích. Nếu tôi đang chọn trên 4 bảng với 6 phép nối, thì đó vẫn là một truy vấn đơn giản hay nên thực hiện bằng db_select ()?
Chris Cohen

3
Đó không phải là về "truy vấn đơn giản" mà là về " chuỗi truy vấn đơn giản " và đơn giản thực sự có nghĩa là mã hóa cứng và không động. Xem câu trả lời của tôi để biết thêm chi tiết :)
Berdir

9

Tôi luôn sử dụng db_select vì tôi thích khả năng đọc, khả năng bảo trì và khả năng tương thích cơ sở dữ liệu chéo hơn mức tăng hiệu suất nhỏ. Hơn nữa, tôi nghĩ rằng những con số được đưa ra trong vấn đề được đề cập cho một hình ảnh sai về hiệu suất tổng thể. Chúng ta đang nói về sự khác biệt 300 micro giây trên một truy vấn mà khi trả về nhiều hơn một cột thường chạy trong phạm vi nhiều mili giây. Và tôi sẽ không ngạc nhiên nếu có một số chi phí 1 lần duy nhất (tải lớp) và do đó, sự khác biệt cho một yêu cầu (trang) đầy đủ là ít hơn nhiều.


Sự khác biệt hiệu suất không đơn giản như vậy; xem So sánh hiệu năng db_query và db_select . Tôi thường khuyên dùng db_query trên db_select trừ khi bạn cần một trong những tính năng đặc biệt được đề cập trong câu trả lời của Berdir.
ge Muffguy
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.