Nếu bạn sử dụng wordpress để triển khai một tờ báo điện tử, hay đơn giản để thử nghiệm với hệ thống với khối lượng dữ liệu lớn, tôi nghĩ bạn sẽ gặp một trường hợp giống như tôi, đó là việc hệ thống xử lý rất chậm và quá tải khi lượng bài viết được cập nhật thường xuyên và liên tục.
Sau khi xem các slow query của MySQL, tôi chợt nhật thấy một điểm đó là khi cập nhật nội dung hệ thông sẽ tự cập nhật tổng số các bài viết thuộc taxonomy mà bài viết đó sử dụng…. sẽ không thành vấn đề lớn, nếu dữ liệu bạn nhỏ, nhưng với lượng dữ liệu khổng lồ thì vấn đề sẽ nằm ở tốc độ truy vấn và tạo ra một câu lệnh Join khổng lồ với cú pháp gốc của WordPress. Mã nguồn được thay đổi tại thư mục wp-includes/taxonomy.php
if ( $object_types )
$count += (int) $wpdb->get_var( $wpdb->prepare( “SELECT COUNT(*) FROM $wpdb->term_relationships, $wpdb->posts WHERE $wpdb->posts.ID = $wpdb->term_relationships.object_id AND post_status = ‘publish’ AND post_type IN (‘” . implode(“‘, ‘”, $object_types ) . “‘) AND term_taxonomy_id = %d”, $term ) );
Với cú pháp trên, số lượng bảng ghi được tạo trong lệnh trên sẽ là tổ hợp của bảng Post và bảng team_relationships, sẽ là vấn đề nếu dữ liệu post và tag của bạn khá lớn.
Các giải quyết của tôi, sử dụng lệnh LEFT JOIN, để hạn chế lại những bản ghi term_relationships phù hợp với yêu cầu thuật toán, thay vì lấy hết ra rồi mới lọc
if ( $object_types )
$count += (int) $wpdb->get_var( $wpdb->prepare( “SELECT COUNT(*) FROM $wpdb->term_relationships LEFT JOIN $wpdb->posts ON $wpdb->posts.ID = $wpdb->term_relationships.object_id AND post_status = ‘publish’ AND post_type IN (‘” . implode(“‘, ‘”, $object_types ) . “‘) WHERE term_taxonomy_id = %d”, $term ) );
Hi vọng nếu bạn gặp trường hợp giống như tôi, có thể giựa vào gợi ý trên để tối ưu hóa hệ thống cho mình.
Còn với tôi, tôi cũng ghi chép ra đây để thay đổi lại mỗi khi cập nhật phiên bản mới của wordpress.
Chúc bạn thành công.