WordPress Tối Ưu Lại Bảng Wp_options Trong Database Của Wordpress

Discussion in 'Thủ thuật mã nguồn' started by Twisted, Jul 2, 2015.

  1. Twisted Membership

    Việc tối ưu lại cơ sở dữ liệu luôn là một trong các việc quan trọng nhất cần phải làm khi một website đã có quá nhiều dữ liệu và có quá nhiều lượt truy cập. Bởi vì bạn biết rằng website càng có nhiều lượt truy cập thì website sẽ càng gửi nhiều truy vấn (query) về database để lấy dữ liệu ra (đa phần là truy vấn SELECT). Mà đã nhiều truy vấn rồi mà dữ liệu lại lớn, chưa được sắp xếp gọn gàng thì nó lại càng mất thêm thời gian để xử lý các truy vấn đó.

    Ngoài việc dọn dẹp database mà mình đã trình bày ở lần trước, chúng ta còn một cách khác nhưng cũng rất quan trọng đó là tối ưu lại bảng wp_options của database. Bảng này sẽ chứa toàn bộ các thiết lập bên trong website, bao gồm các thiết lập theme và plugin. Điều đó có nghĩa là bạn đã từng cài nhiều plugin và theme vào website thì bảng này sẽ rất nặng mặc dù bạn đã tắt các plugin hoặc theme đó đi vì đa phần các plugin không hỗ trợ “làm sạch” chiến trường khi ta tắt đi để có thể sử dụng lại sau này.

    Debug truy vấn

    Trước tiên, chúng ta cần nên xem trực tiếp các query có trên website và thời gian thực thi của nó để coi có query của plugin nào chiếm nhiều thời gian không. Có một cách làm việc này đó là sử dụng plugin Query Monitor.

    Nhưng trước khi cài đặt nó, bạn bật debug trong wp-config.php lên.
    Code:
    define('WP_DEBUG', true);
    Sau đó ở mỗi trang, bạn sẽ xem được query của nó bằng cách ấn vào nút xem debug ở Admin Bar.

    [​IMG]

    Bạn ấn vào và chọn Queries để xem các truy vấn nhé. Bây giờ bạn có thể biết trên trang đó có bao nhiêu truy vấn, mỗi truy vấn tốn bao nhiêu thời gian.

    [​IMG]

    Nếu bạn thấy mình có quá nhiều truy vấn gửi vào table wp_posts thì hãy:

    • Hạn chế sử dụng truy vấn để lấy bài viết ra, bao gồm các widget. Các theme tin tức thường có rất nhiều query kiểu thế này.
    • Hạn chế số lượng bài viết hiển thị trên mỗi trang.
    • Ngoài ra bạn cũng có thể sẽ thấy truy vấn ở một vài plugin. Nếu bạn thấy plugin đó không cần thiết thì tắt đi.

    Kế tiếp là bạn ấn vào menu Debug, chọn Hooks và bạn sẽ thấy có bao nhiêu thành phần được load ra như có bao nhiêu theme được kích hoạt, bao nhiêu hook ở widget, theme sử dụng hook nào để thực thi,…và nếu hạn chế được càng nhiều thì càng tốt.

    [​IMG]

    Ngoài ra bạn có thể xem thêm phần PHP Errors để xem có lỗi nào trong PHP không, nó sẽ cho bạn biết lỗi đó là gì, nằm ở file nào đoạn số bao nhiêu trong code để bạn biết mà sửa.
    Tối ưu bảng wp_options

    Cột autoload trong bảng wp_options nghĩa là để nó xác định xem tuỳ chọn đó có được tải mặc định tự động ra bên ngoài hay không. Điều đó có nghĩa là mặc dù các plugin của bạn không dùng nữa nhưng các thiết lập trong database vẫn còn thì nó vẫn là autoload, đây là lý do sốt một khiến tốc độ truy cập website bị chậm đi.

    Trong bài này có sử dụng truy vấn SQL. Để chạy truy vấn SQL, bạn vào phpMyAdmin -> chọn database cần làm việc và chọn tab SQL. Hoặc nếu bạn không có phpMyAdmin thì đăng nhập vào MySQL Server rồi gõ USE tên_database để chọn database.

    Trước hết, chúng ta kiểm tra xem bảng wp_options có bao nhiêu hàng.
    Code:
    explain SELECT option_name, option_value FROM wp_options WHERE autoload = 'yes'
    Code:
    +------+-------------+---------------+------+---------------+------+---------+------+------+-------------+
    | id   | select_type | table         | type | possible_keys | key  | key_len | ref  | rows | Extra       |
    +------+-------------+---------------+------+---------------+------+---------+------+------+-------------+
    |    1 | SIMPLE      | wp_options | ALL  | NULL          | NULL | NULL    | NULL |  808 | Using where |
    +------+-------------+---------------+------+---------------+------+---------+------+------+-------------+
    Như các bạn thấy là chúng ta có thể thấy được mình đang có 808 hàng trong bảng wp_options. Bây giờ hãy thử thêm INDEX cho cột autoload để xem sự khác biệt.
    Code:
    ALTER TABLE `wp_options` ADD INDEX (`autoload`);
    Bây giờ bạn chạy lại truy vấn ở trên xem nó đã có giảm số hàng xuống chưa, đồng thời cột Extra của mình nó sẽ để là Using index condition.
    Code:
    -+------+---------------+----------+---------+-------+------+-----------------------+
    | id   | select_type | table         | type | possible_keys | key      | key_len | ref   | rows | Extra                 |
    +------+-------------+---------------+------+---------------+----------+---------+-------+------+-----------------------+
    |    1 | SIMPLE      | wp_options | ref  | autoload      | autoload | 82      | const |  762 | Using index condition |
    +------+-------------+---------------+------+---------------+----------+---------+-------+------+-----------------------+
    Ngoài ra thì tốc độ truy vấn của mình cũng giảm đáng kể.

    Trước đó:

    [​IMG]

    Sau khi thêm INDEX

    [​IMG]

    Thế thì tại sao sử dụng INDEX trong MySQL lại giúp bạn giảm thời gian gửi truy vấn?

    Bạn hãy tưởng tượng rằng, INDEX giống như bạn đánh số cho từng trang sách vậy. Khi bạn cần tìm một cái gì đó thì bạn chỉ cần giở ra đúng số trang mà bạn cần tìm thay vì ngồi mò từng trang, phải không? INDEX trong MySQL cũng thế, nó sẽ giúp cho các truy vấn WHERE tìm kiếm dữ liệu nhanh hơn để lấy ra bên ngoài.

    Nếu bạn muốn thì bạn có thể thêm INDEX cho cột post_id và meta_key trong bảng wp_postmeta.
    Code:
    ALTER TABLE `wp_postmeta` ADD INDEX (`meta_key`);
    ALTER TABLE `wp_postmeta` ADD INDEX (`meta_key`);
     
    #1

Share This Page