it-swarm-vi.com

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ó?

Để 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?

69
Chris Cohen

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 field_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ế framesort_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ái gọi là tags và SelectQuery sẽ tự động gọi một hook 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 đã thực hiện đ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ó SelectQuery :: 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 ().

88
Berdir

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í chỉ một 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.

9
fietserwin

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 ().

9
marcvangend