Nếu plugin của bạn sắp có RẤT NHIỀU dữ liệu, thì sử dụng wp_postmeta
KHÔNG phải là ý tưởng hay như được trình bày dưới đây:
Lấy WooC Commerce làm ví dụ, trong một cửa hàng có ~ 30.000 sản phẩm, sẽ có trung bình khoảng ~ 40 bài đăng meta (thuộc tính và mọi thứ) trên mỗi sản phẩm, 5 hình ảnh sản phẩm cho mỗi sản phẩm, có nghĩa là sẽ có ~ 4 hình ảnh meta cho mỗi hình ảnh:
30.000 sản phẩm x 40 meta mỗi cái = 1.200.000 hàng trong wp_postmeta
+
30.000 sản phẩm x 5 hình ảnh mỗi x 4 meta hình ảnh cho mỗi = 600.000 hàng trong wp_postmeta
Vì vậy, chỉ với 30.000 sản phẩm, bạn đang tìm kiếm có 1.800.000 hàng wp_postmeta
.
Nếu bạn thêm nhiều thuộc tính vào sản phẩm hoặc hình ảnh sản phẩm của bạn, con số này sẽ nhân lên.
Vấn đề với điều đó có hai mặt:
- Tự tham gia rất tốn kém với MySQL
wp_postmeta
bảng không được lập chỉ mục trừ khi bạn đang sử dụng các phiên bản mysql sau này (tức là không có chỉ mục FULLTEXT cho meta_value
)
Để đưa ra một ví dụ từ một trường hợp thực tế:
SELECT meta_value FROM wp_postmeta WHERE meta_key LIKE '_shipping_city'
Điều này chọn thành phố vận chuyển từ tất cả các chi tiết đơn hàng đến với một con số khổng lồ ~ 3 giây trên một máy chủ chuyên dụng cấp nhập cảnh ngay cả khi có 5-10 đơn hàng . Điều này là do truy vấn được chạy trong số một wp_postmeta
bảng có ~ 3 triệu hàng trong cài đặt trực tiếp.
Ngay cả trang chủ cũng xuất hiện khá chậm, vì chủ đề lấy các yếu tố khác nhau từ wp_postmeta
- thanh trượt, một vài chèn đánh giá, một vài meta khác. Trong danh sách sản phẩm nói chung là rất chậm, tìm kiếm cũng chậm tương tự khi liệt kê sản phẩm.
Bạn không thể sửa lỗi này thông qua bất kỳ phương tiện thông thường. Bạn có thể đặt Tìm kiếm đàn hồi trong máy chủ của mình và sử dụng plugin Tìm kiếm đàn hồi trong Wordpress, bạn có thể sử dụng redis / memcached, bạn có thể sử dụng plugin bộ đệm trang tốt, nhưng cuối cùng, vấn đề cơ bản sẽ vẫn còn - lấy bất kỳ lượng dữ liệu nào từ một cồng kềnh wp_postmeta
bảng sẽ chậm, bất cứ khi nào nó được thực hiện. Trên máy chủ nơi tôi đã thử nghiệm giải pháp tôi đã triển khai bên dưới, tất cả các giải pháp này đã được cài đặt và định cấu hình đúng và tối ưu hóa, và trang web hoạt động ổn định cho người dùng không đăng nhập hoặc truy vấn thường được thực hiện kể từ khi bổ trợ bộ đệm.
Nhưng thời điểm một người dùng đã đăng nhập đã cố gắng thực hiện một việc không thường được thực hiện hoặc các công cụ lưu trữ, bộ đệm ẩn hoặc bất kỳ tiện ích nào khác muốn lấy dữ liệu thực tế từ db để lưu vào bộ nhớ cache hoặc làm bất cứ điều gì khác, mọi thứ trở nên chậm chạp.
Vì vậy, tôi đã thử một cái gì đó khác:
Tôi đã mã hóa một plugin nhỏ để đưa tất cả meta sản phẩm (postmeta cho sản phẩm loại bài đăng ) vào một bảng tùy chỉnh được tạo bởi mã. Plugin này lấy tất cả meta cho mỗi bài đăng và tạo một bảng bằng cách thêm từng meta dưới dạng cột và chèn các giá trị vào mỗi hàng. Tôi đã biến định dạng EAV thành định dạng quan hệ ngang, phẳng. Tôi cũng đã có plugin để xóa postmeta khỏi tất cả các sản phẩm đã di chuyển khỏi wp_postmeta
bảng.
Trong khi tôi đang ở đó, tôi đã chuyển postmeta đính kèm và tất cả meta của loại bài đăng khác vào các bảng của riêng họ.
Sau đó, tôi nối vào get_(post_type)_meta
bộ lọc để ghi đè truy xuất siêu dữ liệu để phục vụ chúng từ các bảng tùy chỉnh mới.
Bây giờ cùng một truy vấn từ trước đó, mất ~ 3 giây để tìm nạp wp_postmeta
mất ~ 0,006 giây. Trang web bây giờ hoạt động như thể nó là một bản cài đặt WP mới.
....................
Đương nhiên, làm mọi thứ theo cách Wordpress là tốt hơn. Nó thực sự là chuẩn mực.
Tuy nhiên , cũng có kiến thức rõ ràng rằng bảng EAV rất kém hiệu quả trong việc mở rộng quy mô. Nó vô cùng linh hoạt và cho phép bạn lưu trữ bất kỳ dữ liệu nào, nhưng cái giá bạn phải trả cho điều đó, là hiệu suất. Đó là một sự đánh đổi cơ bản.
Trong bối cảnh đó, thật khó để nói với ai đó đang có ý định có hàng đống dữ liệu và - không cho phép - truy vấn / tìm kiếm trên dữ liệu đó để sử dụng wp_postmeta
bảng cho chắc chắn. Các hit hiệu suất sẽ là tuyệt vời.
Sử dụng các bảng tùy chỉnh của bạn sẽ cho phép dữ liệu của bạn chồng chất và vẫn đủ nhanh.
Giống như cách Pippin Williams, người tạo ra plugin Easy Digital Download đã đề cập rằng anh ta sẽ sử dụng các bảng tùy chỉnh nếu anh ta chỉ bắt đầu mã hóa plugin của mình, nếu bạn sẽ tạo ra thứ gì đó sẽ được sử dụng trong thời gian dài hoặc chất đống nhiều dữ liệu, Sẽ hiệu quả hơn khi sử dụng các bảng tùy chỉnh của bạn nếu bạn thiết kế chúng tốt.
Bạn phải đảm bảo rằng bất kỳ nhà phát triển plugin / addon nào khác có nghĩa là móc vào plugin của bạn để thao tác dữ liệu của bạn trước và sau khi lấy lại dữ liệu. Nếu bạn làm điều đó, thì bạn khá vững chắc.