Có gì nhanh hơn db_query, db_select hoặc EntityFieldQuery


15

Vì vậy, tôi đang cố gắng tìm hiểu db_query, db_select hoặc EntityFieldQuery nhanh hơn là gì. Hiện tại tôi đang sử dụng EntityFieldQuery. Tôi đang lấy khoảng 1600 mục nút.

Tôi nhận ra điều này có thể đánh thuế vào hệ thống vì vậy tôi chỉ muốn tìm ra đâu là lựa chọn tốt nhất để lấy 1600 nút. Việc tắt các giây hoặc thậm chí một phần nghìn giây sẽ rất quan trọng với ứng dụng tôi đang xây dựng.

Cảm ơn trước cho câu trả lời của bạn.


Bạn đã định hình nó chưa?
mpdon Arena

Không chắc chắn những gì bạn có ý nghĩa. Bạn có thể xây dựng một chút?
Jorge Calderon

Những gì bạn nên sử dụng phụ thuộc vào những gì bạn đang cố gắng làm chính xác? Nếu bạn có thể cung cấp thêm chi tiết, chúng tôi có thể giúp đỡ. Nếu bạn đang chạy nhiều truy vấn, db_query () là nhanh nhất. Tuy nhiên, nếu bạn đang tải các thực thể với nó (entity_load) thì điều đó có thể không quan trọng, bởi vì entity_load sẽ chậm khi tải 1600+ thực thể.
donutdan4114

1
Có nhiều thứ hơn là tốc độ của mã truy vấn / truy vấn. Ví dụ bạn có cần truy cập nút không?
rooby

@rooby - Vâng tôi làm. Tôi tiếp tục sử dụng EntityFieldQuery nhưng đối với nhu cầu của tôi, tôi phải có quyền truy cập vào ba trường tùy chỉnh trong các nút. Tuy nhiên, câu trả lời dưới đây vẫn là câu trả lời tốt nhất vì raf đã đưa ra một số lời khuyên và con số khá tốt. Đó chính xác là những gì tôi đang tìm kiếm.
Jorge Calderon

Câu trả lời:


24

Để trả lời câu hỏi của bạn một cách ngắn gọn, db_query là nhanh nhất! Dưới đây là một số lý do, sự kiện và con số được tổng hợp từ các câu hỏi, nguồn khác nhau:

Một câu hỏi đơn giản về câu hỏi này, đưa ra kết quả như sau:

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

và điều này

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

Nếu bạn nhận thấy ở trên db_select thực hiện nhiều cuộc gọi hàm hơn và sử dụng nhiều bộ nhớ hơn db_query.

  1. Xem ở đây để biết lý do tại sao sử dụng db_select
  2. Xem ở đây để biết lý do tại sao nên sử dụng EntityFieldQuery qua db_select
  3. Xem ở đây để so sánh hiệu suất của db_query và db_select

Tôi đoán sự lựa chọn chỉ nên dựa trên yêu cầu của bạn. EntityFieldQuery có thể chậm hơn, nhưng cung cấp nhiều lợi thế như cú pháp đơn giản, lưu trữ trường có thể cắm được, khớp nối lỏng lẻo và nhiều hơn nữa.


1
Điều này thật đúng với gì mà tôi đã tìm kiếm. Cảm ơn rất nhiều.
Jorge Calderon

1

Đó là một ý tưởng rất tồi ở đó, đối với 1600 nút, đừng đi xung quanh các API và sử dụng EntityFieldQuery. Bạn đang tối ưu hóa những điều sai trái.


Xin chào Chx, bạn có thể giải thích. Vì vậy, dòng dưới cùng, 1600 nút cần phải được kéo. Tôi đã sử dụng EntityFieldQuery vì vậy chỉ cần cố gắng hiểu ý tưởng tồi là gì. Những gì tôi đã tìm thấy là EntityFieldQuery đang giới hạn ở một số khu vực. Cho đến nay không có gì ảnh hưởng đến tôi. Dù sao, mong muốn được nghe suy nghĩ của bạn.
Jorge Calderon

1

Nếu bạn chỉ muốn dữ liệu trường từ tất cả 1600 nút, thì EFQE có thể hữu ích. Nếu bạn đã có EFQ, bạn sẽ có thể tìm ra những gì bạn cần bằng cách xem trang hộp cát.

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.