Có phải get_option () nhanh hơn truy cập get_transient () không?


8

Hôm nay tôi chạy thử nghiệm qua db của mình để khám phá sự khác biệt về tốc độ giữa việc truy cập khóa từ các tùy chọn, bảng tùy chỉnh & tạm thời. Tôi đã chạy thử nghiệm 1000 lần và sau đây là thời gian để chạy 1000 hoạt động:

  1. get_transient() 0,0245 giây
  2. get_option() 0,0068 giây
  3. thao tác chọn đơn giản từ Bảng tùy chỉnh 0,65 giây

Tôi cũng đã kiểm tra rằng thoáng qua không hết hạn trong bài kiểm tra này. Vì vậy, câu hỏi là, get_option()nhanh hơn get_transient()hoặc tôi đã làm hỏng một cái gì đó trong bài kiểm tra của tôi? Là độ trễ bảng tùy chỉnh do các tùy chọn được lưu trong bộ nhớ cache của WordPress? Ngoài ra, các tùy chọn cũng được lưu trữ bởi các plugin lưu trữ khác nhau như các quá độ?


Câu trả lời cho điều này rất khác nhau, hãy nhớ rằng với bộ đệm đối tượng, các transitor sẽ không sử dụng tùy chọn nào cả. Dù sao nó cũng là một tối ưu hóa vi mô và lãng phí thời gian. Tự động tải nó dưới dạng tùy chọn chỉ đơn giản là chuyển chi phí ở nơi khác
Tom J Nowell

Câu trả lời:


15

Hôm nay tôi chạy thử nghiệm qua db của mình để khám phá sự khác biệt về tốc độ giữa việc truy cập khóa từ các tùy chọn, bảng tùy chỉnh & tạm thời. Tôi đã chạy thử nghiệm 1000 lần và sau đây là thời gian để chạy 1000 hoạt động:

Hãy nhớ rằng bảng tùy chọn được sử dụng cho cả tùy chọn và tạm thời trên hầu hết các hệ thống và bảng đó đã được tối ưu hóa, với các chỉ mục được thêm vào. Vì vậy, nó không phải là một so sánh công bằng

get_transient () 0,0245 giây get_option () 0,0068 giây thao tác chọn đơn giản từ Bảng tùy chỉnh 0,65 giây

Đây cũng là một so sánh không công bằng, các tùy chọn với bộ autoloadtùy chọn, sẽ được tải nâng cao trong một truy vấn sớm. Vì vậy, get_optionđược kéo từ WP_Cache, tùy chọn đã được lấy.

TLDR: Nó không thực sự tìm nạp tùy chọn, nó đã được tìm nạp, nó chỉ lấy nó từ bộ nhớ do autoloadtùy chọn

Tôi cũng đã kiểm tra rằng thoáng qua không hết hạn trong bài kiểm tra này.

Điều này không nên có tác động đến một hệ thống bình thường đối với truy xuất tạm thời, sau tất cả, nó không biết liệu nó đã hết hạn cho đến khi được truy xuất.

Vì vậy, câu hỏi là, get_option () nhanh hơn get_transient () hay tôi đã làm hỏng điều gì đó trong bài kiểm tra của mình?

Nó phụ thuộc:

  • Trên hầu hết các hệ thống, các quá độ được lưu trữ bằng các tùy chọn, cả hai đều liên quan đến một get_optioncuộc gọi
  • Tất cả các tùy chọn autoloadđược đặt thành true đều được tải trong một cuộc gọi khi bắt đầu để chúng được giữ trong bộ nhớ, không có truy vấn nào xảy ra sau đó
  • Bộ nhớ đệm đối tượng lưu trữ cả hai tùy chọn tự động tải và tạm thời

Là độ trễ bảng tùy chỉnh do các tùy chọn được lưu trong bộ nhớ cache của WordPress?

Rất có thể, nhưng việc chọn nhanh như thế nào phụ thuộc rất nhiều vào truy vấn và thiết kế bảng

Ngoài ra, các tùy chọn cũng được lưu trữ bởi các plugin lưu trữ khác nhau như các quá độ?

Có, WP_Cacheđược sử dụng, sẽ lưu trữ nó trong bộ nhớ cho phần còn lại của yêu cầu. Các plugin bộ nhớ đệm có thể duy trì các giá trị này vì lý do hiệu suất.

Lặp lại

Tất cả đều được lưu trong bộ nhớ cache WP_Cachenên lần thứ hai bạn yêu cầu, không có DB nào tham gia.

Sự thay đổi và nó phụ thuộc

Tất cả điều này giả định một cơ sở chung, nhưng đối với bộ đệm đối tượng thì sao?

Hãy giới thiệu một phiên bản MemcacheD hoặc Redis (Tôi thực sự khuyên bạn nên làm như vậy nếu bạn có tùy chọn, lợi ích hiệu suất HUGE cho các trang web được xây dựng tốt, đặc biệt là nếu bạn sử dụng chúng cho bộ nhớ đệm trang, trừ khi bạn có một cái gì đó như thiết lập Varnish)

Bây giờ chúng ta có một tình huống mới:

  • Bây giờ dữ liệu được lưu trữ trong RAM và sau khi được tải xuống từ DB, nó đã được mồi và thời gian truy cập giảm đáng kể. Vẫn chậm hơn một biến, nhưng nhanh hơn đáng kể so với truy vấn cơ sở dữ liệu
  • Rất nhiều dữ liệu mới được lưu trữ trong WP_Cacheđó thường không có. Ví dụ: WP_Postcác đối tượng, bài meta, v.v.
  • WP_Cache bây giờ vẫn tồn tại trên các yêu cầu
  • MemcacheD vv có thể loại bỏ quá hạn quá hạn vv

Vì vậy, bây giờ tạm thời và các tùy chọn có cùng chi phí truy cập. Họ đã ở gần, nhưng giờ họ không đáng kể và có liên quan nhiều hơn đến tải CPU tại thời điểm yêu cầu được đưa ra.

Vì vậy, đối với hiệu suất tôi nên sử dụng Transents hoặc Tùy chọn?

Trong khi đó là một câu hỏi đáng để thắc mắc, câu trả lời là sự khác biệt là không đáng kể và trong phạm vi sai số

nó không đơn giản

Vì vậy, hãy ngừng tối ưu hóa vi mô, chúng là cùng một phương tiện lưu trữ và điều này không xứng đáng với thời gian của bạn

  • Sử dụng tùy chọn nếu bạn cần lưu trữ một cái gì đó rộng khắp trang web
  • Sử dụng tạm thời để lưu trữ tạm thời những thứ đắt tiền để tính toán để bạn không phải đến lần sau

Không đáng để bạn dành thời gian để chọn cái khác dựa trên hiệu suất, không có sự khác biệt có ý nghĩa.

Có nhiều cách tốt hơn để tối ưu hóa giúp tiết kiệm đáng kể, ví dụ như sử dụng phân loại thay vì meta trong truy vấn bài đăng, không sử dụng __nottham số kiểu, thực hiện ít việc hơn trên trang, cài đặt bộ đệm đối tượng, bài đăng thấp hơn trên mỗi trang, tránh yêu cầu từ xa Vân vân

Điều gì về một bảng tùy chỉnh sẽ ...

Không, bảng tùy chọn đã được tối ưu hóa tốt, sử dụng bảng tùy chỉnh sẽ đơn giản di chuyển các hoạt động bên ngoài hệ thống Bộ nhớ đệm WP, buộc bạn phải tự viết


Về tùy chọn, nó được tự động tải trong trường hợp của tôi. Bảng tùy chỉnh chỉ chứa hai hàng và một truy vấn chọn để tìm nạp dữ liệu.
learning_13

Tôi đang làm điều này cho plugin của mình và phải chọn giữa bất kỳ một trong số chúng. Bảng tùy chỉnh dễ thực hiện nhất theo thiết kế của tôi nhưng chi phí tìm nạp đủ lớn sẽ làm chậm tải trang.
learning_13

2
@ learning_13, bạn đã hỏi sai câu hỏi và có thể cả tom và tôi đều không thể mang thông điệp trong câu trả lời của chúng tôi - Bộ nhớ đệm đúng cách sẽ khiến bất cứ điều gì bạn quyết định sử dụng hiệu suất đủ cho các trang web quan tâm đến hiệu suất. Quyết định về cách lưu trữ dữ liệu nên được đưa ra dựa trên cấu trúc của plugin của bạn và chức năng của nó, hiệu suất sẽ là điều cuối cùng cần suy nghĩ.
Đánh dấu Kaplun

2
@ aim100k, vui lòng không để "phụ huynh" tham gia vào câu trả lời ở đây. Những gì mọi người làm cho cuộc sống của họ không nên được đưa lên trừ khi nó có liên quan đến câu trả lời hoặc câu hỏi. Nếu bạn không thích một câu trả lời, hãy từ chối nó. Nếu bạn cảm thấy câu trả lời có thể ổn về mặt kỹ thuật nhưng gây khó chịu, bạn có thể thử chỉnh sửa, gắn cờ hoặc thảo luận về trang web meta.
Đánh dấu Kaplun

@ mark-kaplun, Giả sử tôi lưu trữ dữ liệu trong bảng tùy chỉnh và tìm nạp dữ liệu từ nó cho mỗi kết xuất bài đăng nơi plugin của tôi có liên quan để hiển thị một số dữ liệu. Vì vậy, các plugin bộ nhớ đệm hoặc tối ưu hóa bộ nhớ đệm của người dùng sẽ đảm nhiệm việc lưu bộ đệm đó? Và liệu những nỗ lực bổ sung trong việc triển khai & thiết kế có thay đổi chỉ khi sử dụng các tùy chọn / quá độ thay vì sử dụng bảng tùy chỉnh phù hợp hơn với thiết kế của tôi một mức độ tối thiểu hóa (quá sớm) theo tốc độ tải trang?
learning_13

4

Nếu không tìm thấy bộ nhớ đệm đối tượng, get_transientgọi get_optionhai lần, một lần hoặc khoảng thời gian hết hạn và một cho giá trị, do đó nó sẽ không nhanh hơn.

get_optionhiệu suất của chính nó sẽ bị ảnh hưởng đến việc tùy chọn có "tự động tải" (mặc định) hay không. Tất cả các tùy chọn được tải tự động được truy xuất trong một yêu cầu cho DB và được lưu trong bộ nhớ cache và do đó sẽ có rất ít tác động đến số lần bạn gọi get_optionngay cả khi đó là cho các tùy chọn khác nhau.

Khi bạn truy cập DB trực tiếp, bạn bỏ qua tất cả các bộ đệm và các cải tiến hiệu suất khác, và nó sẽ chậm hơn trừ khi bạn tự thực hiện một số logic thông minh.

Tất cả những gì đã nói, tôi không chắc bài kiểm tra của bạn là bài kiểm tra tốt, nhưng bất kể, toàn bộ cuộc thảo luận là vô nghĩa vì nếu bạn thực sự quan tâm đến hiệu suất, bạn sẽ sử dụng hệ thống bộ đệm đối tượng (và plugin có liên quan) sẽ mang lại thời gian truy cập dữ liệu gần hơn về không .... và tất nhiên nếu bạn quyết định sử dụng các bảng DB của riêng mình, bạn nên tích hợp các API truy cập của mình với cơ chế lưu trữ đối tượng.

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.