Apr 23, 2020
11 Views
Comments Off on Cách tối ưu cơ sở dữ liệu (database) trong WordPress

Cách tối ưu cơ sở dữ liệu (database) trong WordPress

Written by

Tối ưu hóa các bảng

Sử dụng các câu lệnh Tối ưu hóa bảng (optimize table) là thực hành tốt để duy trì chất lượng và hiệu suất của CSDL. Tối ưu hóa bảng sẽ tạo lại bảng đã chọn và loại bỏ bất kỳ không gian đĩa thừa nào được sử dụng bởi bảng đó. Giải phóng không gian đĩa thừa giúp cải thiện hiệu suất bằng cách giảm số lượng dữ liệu phải lưu giữ trong bộ nhớ khi truy cập bảng.

Để tối ưu hóa các bảng CSDL:

  1. Đăng nhập vào phpMyAdmin
  2. Chọn CSDL (wp_environmentname)
  3. Tick vào hộp nhỏ bên cạnh các bảng bạn muốn tối ưu hóa
  4. Ở cuối, trong phần xổ xuống, bạn chọn Tối ưu hóa bảng (Optimize table)

Các kiểu bảng Storage engine và bộ nhớ

Có hai cơ chế storage engines chính để tạo bảng: MyISAM và InnoDB. Kiểu storage engine trang của bạn sử dụng sẽ ảnh hưởng lớn đến hiệu suất do có sự khác biệt trong cách chúng ghi dữ liệu và sử dụng các nguồn tài nguyên máy chủ (server resources). Chúng tôi luôn khuyến khích sử dụng kiểu storage ingine InnoDB để tạo bảng.

Hiệu suất của MyISAM chỉ ổn ở khía cạnh đọc CSDL, nhưng khi nói đến việc viết và cập nhật CSDL, toàn bộ bảng sẽ bị khóa (locked) cho đến khi quá trình xử lý hoàn tất. Điều này sẽ ngăn bất kỳ hoạt động đọc/ghi nào được phép bắt đầu trong bảng cho đến khi một quá trình xử lý cụ thể được hoàn tất. InnoDB chỉ khóa một hàng cần để ghi, phần còn lại của bảng được tự do cho các hoạt động đồng thời khác.

Sự khác biệt quan trọng khác là cách các storage engines tương tác với bộ nhớ trong máy chủ (server). Có một pool bộ nhớ cụ thể được gọi là InnoDB Buffer Pool được sử dụng bởi các bảng InnoDB. Các bảng dùng MyISAM không thể sử dụng pool bộ nhớ này, điều đó có nghĩa là họ ghi vào đĩa (disk) thay vì sử dụng bộ nhớ CSDL.

Để kiểm tra storage engine bạn đang dùng:

  1. Đăng nhập
  2. Click vào phpMyAdmin
  3. Chọn CSDL (wp_environmentname)
  4. Nhìn vào cột “Type

Bạn có thể sắp xếp cột này bằng cách click vào tên

tên storage engine

Một khi bạn phát hiện một bảng nào đấy đang sử dụng MyISAM, hãy chuyển nó sang kiểu bảng InnoDB. Thay thế table_name bằng tên bảng tương ứng.

ALTER TABLE table_name ENGINE=InnoDB;

Dọn dẹp CSDL

Điều quan trọng và có ích cho hiệu suất CSDL của bạn là loại bỏ các dữ liệu dư thừa cũng như giảm nguy cơ phình to CSDL qua thời gian (theo thời gian, bạn có nhiều nội dung hơn, thử nghiệm vô số plugin, giao diện, và vì vậy CSDL có khuynh hướng ngày càng lớn hơn).

MySQL là hệ thống CSDL kiểu quan hệ (relational), có nghĩa là dữ liệu trong một bảng thường sẽ có mối liên hệ dữ liệu ở trong bảng khác. Khi một giá trị dữ liệu, chẳng hạn như một bài đăng, bị loại bỏ khỏi một bảng, nó có thể bỏ lại dữ liệu không còn ý nghĩa trong một bảng khác (mà nó từng có liên hệ trước đây).

Câu lệnh dùng để kiểm tra xem bảng của bạn có bất kỳ dữ liệu postmeta nào vô ích hay không:

SELECT COUNT(pm.meta_id) as row_count FROM wp_postmeta pm LEFT JOIN wp_posts wp ON wp.ID = pm.post_id WHERE wp.ID IS NULL;

Loại bỏ bất cứ postmeta nào vô ích:

DELETE pm FROM wp_postmeta pm LEFT JOIN wp_posts wp ON wp.ID = pm.post_id WHERE wp.ID IS NULL;

Kiểm tra xem trang của bạn có bất cứ commentmata nào vô ích hay không:

SELECT COUNT(*) as row_count FROM wp_commentmeta WHERE comment_id NOT IN (SELECT comment_id FROM wp_comments);

Loại bỏ bất cứ commentmeta nào vô ích:

DELETE FROM wp_commentmeta WHERE comment_id NOT IN (SELECT comment_id FROM wp_comments);

Ngoài ra trang của bạn có thể có revision từ các bài đăngXóa bỏ bất cứ revisions nào bằng câu lệnh:

DELETE FROM wp_posts WHERE post_type = "revision";

Kiểm tra wp_session data:

SELECT * FROM `wp_options` WHERE `option_name` LIKE '_wp_session_%'

Loại bỏ wp_session data:

DELETE FROM `wp_options` WHERE `option_name` LIKE '_wp_session_%'

Loại bỏ transients quá hạn:

DELETE FROM `wp_options` WHERE `option_name` LIKE ('%_transient_%')

Loại bỏ các tag không có mối liên hệ với bất cứ bài post nào:

DELETE FROM wp_terms WHERE term_id IN (SELECT term_id FROM wp_term_taxonomy WHERE count = 0 );
DELETE FROM wp_term_taxonomy WHERE term_id not IN (SELECT term_id FROM wp_terms);
DELETE FROM wp_term_relationships WHERE term_taxonomy_id not IN (SELECT term_taxonomy_id FROM wp_term_taxonomy);

Loại bỏ các pingbacks và trackbacks:

DELETE FROM wp_comments WHERE comment_type = 'pingback';
DELETE FROM wp_comments WHERE comment_type = 'trackback';

Các plugin giúp dọn dẹp cơ sở dữ liệu

Hoàn toàn dễ hiểu thôi, việc thực hiện một số lượng lớn truy vấn có thể đáng sợ, nhất là khi trước đó bạn chưa từng thao tác với CSDL. Có một số plugin có thể hỗ trợ bạn, tuy nhiên các plugin có thể xóa dữ liệu kém cẩn trọng hơn so với khi chạy từng truy vấn SQL. Hãy thực hiện backup trước khi tiếp tục. Chúng tôi cũng khuyến cáo bạn kiểm tra bất cứ thay đổi nào trong môi trường staging (*) trước khi làm điều này ở phiên bản website chính thức.

(*): staging là môi trường demo cho website của bạn, nó giúp bạn kiểm tra kỹ lưỡng các thay đổi thử nghiệm, và khi mọi thứ ổn thỏa, bạn có thể đẩy nó lên website chính thức mà hiếm khi phải gặp rủi ro.

Một số plugin hỗ trợ bạn là:

Các dữ liệu được tải tự động (autoloaded)

Một số thông tin trong CSDL phải được tải trong mỗi yêu cầu, chẳng hạn như URL của trang, giao diện và plugin nào đang được kích hoạt. Trong WordPress, điều này được gọi là dữ liệu tải tự động và nó được lưu trữ trong bảng wp_options (các tùy chọn của WP).

Trong khi dữ liệu tải tự động hữu ích trong một số trường hợp, nó cũng thường chứa nhiều thông tin không cần thiết. Một lời khuyên là bạn nên giữ tổng lượng dữ liệu tải tự động dưới 800 ngàn byte (khoảng 0,8Mb) để tối ưu hiệu suất.

Với từng hàng trong bảng tùy chọn, có một giá trị tương ứng trong cột “autoload” có thể là yes/có hoặc no/không. Vô hiệu hóa tự động tải cho một hàng đơn giản có nghĩa là thiết lập giá trị trong cột này là no.

ví dụ về autoload

Vô hiệu hóa tự động tải trong dữ hiệu hàng không làm loại bỏ nó khỏi CSDL của bạn, nó chỉ đơn giản có nghĩa là thông tin ở hàng đó không còn được gọi mỗi khi trang được tải tự động. Khi tự autoload được đặt là no, dữ liệu ở hàng đó chỉ được kéo vào trang khi có yêu cầu.

Cuối cùng, chuyện này là tùy thuộc vào bạn hoặc nhà lập trình quyết định là thông tin nào trong website cần được tự động tải và cái nào có thể được vô hiệu hóa mà không làm hỏng chức năng của trang. Bên dưới chúng tôi chia sẻ một số truy vấn hữu ích để điều khiển dữ liệu tải tự động.

Tính toán tổng lượng dữ liệu tải tự động theo bytes:

SELECT SUM(LENGTH(option_value)) FROM wp_options WHERE autoload = 'yes';

Tìm và sắp xếp 20 hàng có giá trị tải tự động lớn nhất:

SELECT LENGTH(option_value),option_name FROM wp_options WHERE autoload='yes' ORDER BY length(option_value) DESC LIMIT 20;

Vô hiệu hóa tải tự động cho một tùy chọn cụ thể. Thay option_name bằng tên tùy chọn thực sự mà bạn tìm ra khi sử dụng ở câu lệnh trước:

UPDATE wp_options SET autoload='no' WHERE option_name='option_name';

EX: UPDATE wp_options SET autoload='no' WHERE option_name='really_large_row';

Sau khi bạn giảm tổng lượng dữ liệu tải tự động xuống dưới 800K byte, cần đảm bảo bảng tùy chọn được lập chỉ mục (indexed). Điều này giúp trang web của bạn phục vụ dữ liệu tải tự động mới đã được dọn dẹp nhanh hơn.

CREATE INDEX autoloadindex ON wp_options(autoload, option_name);
Article Categories:
Code/Web
    http://linholiver.com

    https://linholiver.com/diary/about/