• Skip to main content

MrHói's Blog

The simple is the best

You are here: Home / Lập trình / Wordpress / Tối ưu xử lý wordpress với dữ liệu lớn khi thêm mới bài viết

Tối ưu xử lý wordpress với dữ liệu lớn khi thêm mới bài viết

July 14, 2013 by mrhoi 2 Comments

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.

Filed Under: Wordpress Tagged With: cập nhật, COUNT, FROM, JOIN, LEFT, Left Join, SELECT, SELECT COUNT, WHERE

Reader Interactions

Comments

  1. suc khoe says

    August 21, 2013 at 10:27 am

    dữ liệu lớn ở đây là tầm bao nhiêu bài viết hả bạn

  2. mrhoi says

    August 24, 2013 at 1:12 pm

    Lớn tuỳ thuộc vào hạ tầng mà, với Server cùi bắp của mình thì là con số 1 triệu bản ghi tương ứng với khoảng hơn 200-300k bài viết. Các tag thì nhiều vô số kể, thường gấp 5 lần số lượng bài viết.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Copyright © 2026 · Revolution Pro on Genesis Framework · WordPress · Log in