WordPress sử dụng hệ thống quản lý database nguồn mở MySQL để lưu trữ và xuất tất cả thông tin về website, từ nội dung của bài post, đến comments, usernames và passwords.

Nếu bạn cần hình ảnh hóa các thông tin này, hãy hình dung database là tủ tài liệu đầy ấp, và MySQL là công ty dịch vụ sắp xếp các tài liệu này.

MySQL là lựa chọn database phổ biến cho ứng dụng web – Joomla! và Drupal có dùng MySQL, và theo như Wikipedia, rất nhiều công ty “mặt to” như Google, Facebook, Twitter, Flickr và Youtube cũng dùng hệ thống này.

Vậy chính xác thì MySQL và WordPress phối hợp như thế nào? Trong bài viết này, tôi sẽ giải thích mọi thứ cần biết về MySQL và cách hệ thống tương tác với WordPress, bao gồm cấu trúc database, storage engines, kỹ thuật tối ưu và và quản lý database.

MySQL là gì?

MySQL thành phần chủ chốt trong LAMP stack của phần mềm ứng dụng web nguồn mở dùng để xây dựng websites. LAMP là viết tắt của Linux, Apache, MySQL và PHP. MySQL còn được dùng trong LEMP stack (thay thế Apache cho Nginx).

WordPress sử dụng PHP, với SQL queries trong PHP markup để lưu trữ và xuất dữ liệu từ MySQL databases. Ví dụ như, nếu bạn là thành viên của một trang web sử dụng hệ thống quản lý của WordPress, SQL được dùng để log in, lấy membership ID, kiểm tra xem bạn có active membership, và đảm bảo front-end đang hiển thị đúng profile data.

PHP và SQL làm việc song song trong WordPress, giúp bạn tạo dynamic content dựa trên nhiều yếu tố khác nhau, như IDs và user roles của bạn. Điều này cho phép bạn làm nhiều việc như hide hoặc show content tới người dùng cụ thể, như admins, editors hay subscribers. Những công việc này không thể hoàn thành nếu SQL và MySQL.

Plugins và themes cũng lưu trữ data trong database của bạn, như options, và sử dụng SQL trong PHP markup để query đến database và output content.

Đặc biệt, nếu bạn đang quản lý một website nhỏ (như blog cá nhân về mèo), bạn thực sự không cần phải “chơi đùa” với SQL đâu.

Cấu trúc database WordPress: Tables, Tables, Tables

Để giúp các bạn hiểu được cơ chế làm việc chính xác giữa WordPress và MySQL, hãy xét qua các tables WordPress được lưu trữ trong một database điển hình.

WordPress có lược đồ database khá rõ ràng và đơn giản, bao gồm 11 tables, được các core components của WordPress sử dụng và không thể bị xóa bỏ.

wp_commentmeta – Lưu trữ metadata từ tất cả comment trên các WordPress posts và pages, gồm các custom post types.

wp_comments – Lưu trữ mọi comments được thực hiện trên site, gồm published, draft, pending and và comments.

wp_links – Giữ tất cả thông tin xoay quanh tính năng links manager của WordPress, tính năng này hiện ít được sử dụng, với tính năng link ngày càng được tách khỏi WordPress (3.5) và được mặc định ẩn trên các installs mới.

wp_options – table này không chỉ lưu trữ WordPress options, mà plugin hiện nay cũng thường dùng table này để lưu trữ settings thay cho custom table.

wp_postsmeta – Table này lưu trữ tất cả metadata liên kết với posts và pages.

wp_posts – Lưu trữ tất cả các posts, cũng như pages và navigation/menu items.

wp_terms – Table này lưu trữ categories cho posts, links, và tags.

wp_term_relationships – Posts được liên kết với categories và tags từ wp_terms table, và liên kết này được duy trì trong wp_term_relationships table. Liên kết của các links đến categories tương ứng cũng được giữ trong table này.

wp_term_taxonomy – Miêu tả phép phân loại như category, link, hoặc tag cho entries trong wp_terms_table.

wp_usermeta – Lưu trữ metadata của tất cả người dùng từ wp_users table.

wp_users – Mọi người dùng được lưu trữ trong table này. Nên nhớ, các dữ liệu như passwords đều được tuần tự hóa (serialized).

Multisite Databases có cấu trúc rất khác

Database cho Multisite install được cấu trúc rất khác với database của site đơn lẻ. Để quản lý hiệu quả hơn cho từng database, các bạn cần biết được các điểm khác biệt sau:

wp_blogs – Mỗi site được tạo nên Multisite network sẽ được lưu trữ trong table này.

wp_blog_versions – Lưu trữ database version hiện hành của mỗi site trên network và chủ yếu được dùng trong quá trình nâng cấp của network. Table sẽ cập nhật khi mỗi site được cập nhật.

wp_registration_log – Ghi chép các admin user creates khi mỗi site mới được đăng ký.

wp_site – Table này chứa địa chỉ của main site.

wp_sitemeta – Mỗi site đều có site data; table này chứa site data bao gồm nhiều tùy chỉnh bao gồm site admin.

wp_users – Chứa tất cả users, đồng thời field này cũng được sử dụng trong single site install; bao gồm hai extra fields/rows spam và deleted.

wp_usermeta – Khi dùng Multisite, table này lưu trữ metadata của users cho mỗi site (đây không phải là re-creation của wp_usermeta trong một site install duy nhất).

Tables riêng cho từng site cũng được thêm vào database, ví dụ như wp_2_commentmeta, wp_2_comments, wp_2_links. Dữ liệu của main site được lưu trữ trong các tables chưa đánh số đã có, và các site theo sau đó có dữ liệu lưu trữ trong tables đã đánh số theo sau tên cấu trúc của man site tables.

Plugins cũng có dùng database nữa

Khi bạn cài đặt một plugin, plugin sẽ dùng database của bạn để lưu trữ và lấy dữ liệu liên quan đến plugin đó. Ví dụ, một custom field plugin sẽ lưu field được tạo vào database và sau đó lại xuất ra để hiển thị trên các posts được liên kết. Nếu không có database, plugin không thể lưu trữ được bất cứ field nào nó tạo ra, hay liên kết một field với post và querry values để hiển thị trên front-end.

Plugins có thể sử dụng database tables mặc định của WordPress (như wp_posts hay wp_postsmeta) hoặc tạo custom tables. WooCommerce là ví dụ điển hình plugin tạo custom tables riêng, lên đến tám custom tables để lưu trữ và xuất product IDs, order items, tax rates và các thông tin khác về sản phẩm.

Đừng nên quá lo lắng khi plugin tạo tables trong database của mình, đây là một chuyện rất bình thường trong thế giới plugin. Tuy plugin sẽ ưu tiên sử dụng tables sẵn có (như wp_options) để lưu trữ dữ liệu plugin, nhưng sẽ vẫn có trường hợp ngoại lệ, đặc biệt với những plugin phức tạp như WooCommerce.

Chú ý: Nếu bạn xóa bỏ plugin khỏi site, hãy delete luôn custom tables từ database đó. Một số plugins có tích hợp tùy chọn tự động xóa bỏ tất cả dữ liệu liên kết đến plugin khi bạn unistall. Nên nhớ, bạn chỉ nên xóa bỏ customs tables của plugin đó khi bạn chắc chắn sẽ không sử dụng lại plugin đó nữa, vì đã xóa thì sẽ không cách nào khôi phục được đâu.

Giải thích thêm về MySQL storage engines

MySQL sử dụng storage engines để lưu trữ, xử lý và xuất thông tin từ một table. Tuy MySQL cung cấp đến 13 storage engines khác nhau, nhưng chỉ có hai tùy chỉnh MyISAM và InnoDB là phổ biến nhất.

Đa phần, storage engine mặc định trong MySQL configuration file thường là MyISAM, và cũng chính là storage engine được lựa chọn nhiều nhất. (vì nhiều người chả có thời gian kén chọn, cứ để mặc định là được rồi)

Nếu bạn quyết định lựa chọn storage engine khác, với WordPress, đây là một lựa chọn khá dễ dàng – MyISAM có thể nhanh hơn khi đọc, còn InnoDB lại nhanh hơn khi cả đọc lẫn viết nhờ vào cơ chế row locking. Vì WordPress phụ thuộc rất nhiều vào cả đọc và viết, nên InnoDB là lựa chọn tốt nhất.

Đồng thời, tables mặc định được tạo trong phpMyAdmin sử dụng MyISAM storage engine. Thông thường, điều này đồng nghĩa rằng nếu bạn sử dụng shared hosting hoặc non-specialist WordPress host, tables sẽ sử dụng MyISAM chứ không phải InnoDB. Nếu bạn muốn thay đổi storage engine, bạn có thể sử dụng SQL query sau (bạn có thể thực thi query này trong công cụ quản lý database tùy thích, ví dụ như phpMyAdmin chẳng hạn):

SET default_storage_engine=InnoDB;

Chú ý: Ví lý do lạ kỳ nào đó, tables được tạo trong/bới phpMyAndmin sẽ mặc định sử dụng MyISAM. Nói cách khác, nếu các bạn sử dụng shared hosting hoặc nonspecialist host, tables sẽ là MyISAM. Đừng lo! Bạn có thể thay đổi engine mà database sử dụng. Để thay đổi một table, bạn có thể sử dụng:

ALTER TABLE table_name ENGINE=InnoDB;

Thay đổi từng table một rất tốn thời gian, nếu muốn nhanh hơn, các bạn có thể đọc thử Pantheon’s excellent tutorial.

Bây giờ bạn có thể đang nghĩ, “Tuyệt! vậy còn plugin tạo custom tables thì sao – chúng dùng engine gì?” Câu trả lời là: Chúng có thể sử dụng rất nhiều plugin. Một số declare SQL statements để dùng InnoDB, còn số khác sử dụng MyISAM. Nhìn chung, bạn nên để ý database sau khi cài đặt plugin mới (có tạo custom tables) để xem thử MySQL engine nào đang chạy.

WP_Query

Class `WP_Query` là một query WordPress cực kỳ mạnh mẽ, bạn có thể sử dụng query này để tiếp cận post trong database.

Tối ưu WordPress Database

Database thiếu tối ưu và được bảo dưỡng sơ sài là lý do thường gặp dẫn đến site chạy chậm.

Chúng ta đã tìm hiểu các lợi ích khi lựa chọn được một database engine phù hợp và giờ đây chúng ta sẽ xem thử xem bạn có thể loại bỏ rác trên trang như thế nào, để làm cho site nhẹ nhàng hơn.

Trước khi tối ưu database, bạn nên tạo backup trước để đề phòng. Backup plugin Snapshot Pro là một lựa chọn khá tốt. Plugin này có thể backup và restore cả site chỉ với một cú click chuột.

Chỉ cài đặt những Plugins mà bạn thực chất sẽ sử dụng

Một cách tối ưu database đơn giản (mà thực chất không cần phải làm gì thêm cả) là hãy cài đặt chỉ những plugin mà bạn sẽ chỉ sử dụng. Bất cứ ai cũng rất dễ bị “cám dỗ” trước những plugin mới cóng lấp lánh! chỉ cần nhớ rằng, cài đặt càng nhiều plugin, sẽ càng có nhiều data mới mọc ra trong database.

Có một số plugin nổi tiếng với khả năng lưu trữ một lượng lớn data, và những plugin này được chia thành 4 nhóm:

  • Security Plugins – Đa số security plugins thu thập và lưu trữ thông tin về các cuộc tấn công đến site, để bảo vệ site phần nào khỏi các cuộc tấn công, spam, nỗ lực login,… trong tương lai.
  • Statistics Plugins – Những plugin này không thu thập data từ nguồn thứ ba (như Google Analytics) mà lưu trữ các thông số như page, visits, browsers, keywords… trong database.
  • Anti-Spam Plugins – Do tính chất của mình, anti-spam plugins lưu trữ lượng lớn dữ liệu khá giống security plugins, bao gồm các thông tin như địa chỉ IP, địa chỉ email, quốc gia,…
  • Popular Posts Plugins – Theo dõi các thông tin như lượt views và likes của hàng trăm/nghìn bài post.

Bạn có nên ngừng sử dụng các plugin trên hay không? Có và không. Tuy bạn phải để ý về vấn đề spam và bảo mật trên trang, nhưng nếu nhũng kiểu plugin “nổi tiếng” này không phù hợp với site của bạn, nên tránh và loại bỏ nếu có thể.

Spam

Spam comments là một trong những lý do chính khiến database “mập mạp” không được bảo trì đúng. Nhưng may thay, việc loại bỏ những comment lại cực kỳ đơn giản.

Bạn có thể chạy một SQL command sau:

DELETE FROM wp_comments WHERE comment_approved = ‘spam'

Hoặc, nếu bạn login vào WordPress dashboard và vào Comments > Spam, bạn sẽ thấy nút “Empty spam”. Click vào đó và tất cả spam trên trang sẽ biến mất. Trước khi xóa bỏ spam comments, hãy đảm bảo chúng thực sự đúng là spam. Nhiều comment không phải spam, nhưng vẫn thường bị gắn mác thành spam.

Nếu bạn không muốn xử lý spam thủ công, Akismet là plugin phổ biến nhất hiện nay cho công việc này, cho phép bạn set delete spam comments tự động.

Revisions

WordPress 2.6 có giới thiệu tính năng post revision, cho phép bạn lưu trữ các phiên bản trước đó của bài viết. Trái với suy đoán của nhiều người, mỗi bài viết chỉ lưu giữ một autosave, và tự động xóa bỏ các autosave cũ. Như vậy, tables của bạn sẽ không phải nai lưng ra chứa autosaves nữa. Tuy nhiên, table sẽ mở rộng với mỗi lần bạn lick “Update” trên post hoặc save draft mới.

Vì tính hữu dụng của tính năng này, bản thân tôi và các bạn có lẽ không nên tắt đi, nhưng bạn vẫn có thể tiếp kiệm không gian trong database bằng cách xóa bỏ revisions cũ. Để duy trì một lượng revisions tối đa, bạn có thể thêm một define tiện lợi vào wp-config.php file:

define( 'WP_POST_REVISIONS', 5 );

Bạn chỉ việc thay đổi số trong ngoặc sang số lượng revisions tối đa bạn muốn giữ, -1 sẽ lưu trữ tất cả revision, và 0 sẽ không lưu trữ revisions ngoại trừ autosave.

Để xóa bỏ revisions khỏi các posts đã có, bạn sẽ phải chạy SQL command hoặc sử dụng plugin tối ưu trong WordPress. Nếu lựa chọn sử dụng SQL, các bạn có thể chạy command sau:

DELETE a,b,c FROM wp_posts a
LEFT JOIN wp_term_relationships b ON (a.ID = b.object_id)
LEFT JOIN wp_postmeta c ON (a.ID = c.post_id)
WHERE a.post_type = 'revision'

Query này xóa bỏ tất cả post revisions khỏi những post này, đồng thời còn xóa bỏ cả meta và taxonomies liên quan. Dù vậy, nên nhớ query này sẽ xóa bỏ TẤT CẢ revisions.

Nếu bạn muốn dùng plugin, hãy xem thử Optimize Database after Deleting Revisions. Plugin này không chỉ cho phép bạn loại bỏ revisions, mà còn là plugin tương thích multisite cho phép bạn xóa một số mục như tags không được sử dụng, orphan post meta,…

Xóa những Tables không sử dụng

Plugins tạo custom tables thường không delete những tables này khi đã uninstalled. Nếu bạn xóa bỏ plugin và không định dùng lại plugin đó nữa, bạn sẽ muốn xóa bỏ những table này đấy. WPDBSpringClean cũng là một plugin phù hợp cho tình huống này, nhưng plugin này đã bị tác giả “bỏ xó” được hai năm rồi, và nhìn chung, bạn cũng không nên dùng plugin để xóa tables.

Việc xác định xem table có đang được sử dụng hay không không hề dễ dàng. Dù nhìn chung, plugins đặt tên tables của chúng theo tên của plugin hoặc main class của plugin (như vậy thì dễ tìm hơn rồi). Tất nhiên, như tôi đã nói bên trên, trước khi xóa bỏ tables hay thay đổi database, luôn luôn backup đầy đủ.

Tối ưu database thủ công

MySQL có hỗ trợ query OPTIMIZE, mà theo official manual, “tái tổ chức kho lưu trữ vật lý của table data và index data liên quan, để giảm không gian lưu trữ và cải thiện hiệu suất I/O khi truy cập table.” Những thay đổi chính xác lên mỗi table dựa vào storage engine được table đó sử dụng.

Bạn có thể chạy OPTIMIZE query khi sử dụng database management tool, như phpMyAdmin.

Optimizing Your Database with a Plugin

Nếu bạn muốn plugin “bẩn tay” thay bạn, WP-Optimize hiện là lựa chọn miễn phí còn hoạt động với hơn 500.000 lượt cài đặt trên WordPress. plugin này có thể xóa bỏ post revisions, metadata cũ, draft posts, và xóa đồng loạt comment rác.

Đồng thời, WP-Optimize còn có thể áp dụng OPTIMIZE query mà không cần phải sử dụng database management tool hay manual query trong database management tool.

Sửa chữa WordPress Database

Nếu database của bạn bị corrupted vì đủ thứ lý do, đừng hoảng loạn! bạn có thể edit file wp-config.php để sửa chữa:

define('WP_ALLOW_REPAIR', true);

Khi bạn đã saved file, khởi động trình duyệt và truy cập www.example.com/wp-admin/maint/repair.php

Trên repair screen, bạn có thể chỉ sửa chữa database, hoặc đồng thời cả sửa chữa và tối ưu. Khi bạn đã lựa chọn, WordPress sẽ sau đó tự động tim cách sửa chữa database.

Đôi khi, cách sửa chữa này không có tác dụng, hoặc chỉ có tác dụng một phần. Trong trường hợp này, hãy mở phpMyAdmin và sửa chữa database theo từng table một.

Nhưng nếu cách này cũng không hiệu quả? Trừ khi bạn là SQL ninja và chuyên gia phục hồi data, đây là lúc bạn phải khôi phục backup trước đó nếu có.

WordPress database caching làm việc như thế nào?

Caching trong WordPress là một khái niệm vô cùng rộng lớn. Bởi vậy, với dung lượng giới hạn trong bài biết này, tôi sẽ chỉ giới thiệu những phần quan trọng nhất bạn cần biết.

Transients API

Transients API rất giống với Options APi trong WordPress (cách lưu trữ data đơn giản và chuẩn hóa trong database; giúp dễ tạo, truy cập, cập nhật, và xóa bỏ options), nhưng với tính năng expiration time mới xuát hiện, quá trình sử dụng wp_options database table để tạm thời lưu trữ cached information sẽ trở nên đơn giản hơn.

Trong WordPress, bạn có thể sử dụng transients để liên tục thay đổi data mà bạn muốn hết hạn và cập nhật, hoặc để thay thế cho các database queries có cường độ lớn hơn mà bạn muốn cache.

Một khuyết điểm duy nhất là transients được code rất sơ sài; có thể transient có thời gian hết hạn đấy, nhưng lại không được set để bị xóa bỏ, kết quả là transient cố load, nhưng lại không tồn tại. Hơn nữa, việc cài đặt transient deletion plugins trên site đang ngày càng phổ biến; và xóa phải transients được themes và plugins sử dụng (mà ta không nên xóa) có thể gây nhiều sự cố khó chịu.

Trên hết, bạn chỉ nên xóa transients khi biết chắc chúng để làm gì – cứ cắm đầu xóa đủ thứ transients sẽ phá hư cả site không chừng.

Memcached

Sử dụng Memcached trên site cho phép bạn đẩy nhanh intensive database queries (data và objects) trong RAM để giảm reads trên database, Việc này cho phép page load nhanh hơn vì data đã chuẩn bị sẵn mà không phải thực hiện query.

Một khuyết điểm, như với mọi caching, rằng nếu bạn cập nhật post/page/site khi đã cached, bạn sẽ phải flush cached trước thay đổi được hiển thị.

Một lỗi mà nhiều người hay phạm phải với Mencaching là cài đặt những plugin như W3 Total Cache, nhìn vào setting cho Memcache, và kích hoạt mà vẫn chưa thực sự cài đặt Memcache. Bạn không thể chỉ set option mà không tùy chỉnh Memcached database/server side trước! Tinh chỉnh Memcached (hoặc bất cứ trình object caching nào khác) không đúng cách có thể phá tan tành site và database của bạn, gây nhiều sự cố (bên cạnh vấn đề về transient) về việc cập nhật dự động và plugins/themes phụ thuộc và transients.

Redis

Không còn nghi ngờ gì nữa, phương pháp caching (dựa theo database) ưa thích của tôi với WordPress là Redis, giúp cải thiện rõ rệt load time của page.

Bạn có thể sử dụng plugin Redis Object Cache để kết nối Redis sang WordPress site, nhưng phải set up Redis và config caching trước. Bạn có thể sử dụng Predis script hoặc Redis extension của HHVM (chỉ khi sử dụng HHVM thay cho PHP).

Cần phải config Redis cho hợp lý – đừng lưu trữ từng block data lơn lên mỗi key và bám chặt một lượng keys phù hợp vì không việc gì phải dúng đến database caching nếu bạn dự định thực hiện hàng nghìn Redis calls (dẫn đến object cache transactions lâu hơn).

Dù bạn sử dụng Memcached hay Redis, cả hai có sự khác biệt khá rõ rệt: Memcached là hệ thống lưu trữ caching, trong Redis lại là server cấu trúc dữ liệu (data structure server), cho phép nó được dùng như kho dữ liệu chứ không phải chỉ là volatile cache.

MariaDB

MariaDB là anh em của MySQL, được xây dựng bởi một trong nhiều lập trình viên và sáng lập viên của MySQL sau khi được Oracle mua lại.

MariaDB được biết đến vì tốc độ cao hơn đôi chút, nhờ vào replication nhanh hơn và threads pool cho phép đến hàng chục nghìn kết nối mà vẫn không làm chậm I/O đáng kể. MariaDB còn cung ấp lượng lớn storage engines có thể thay thế hoàn hảo cho storage engines như InnoDB hiện đang khá nổi.

Tuy Memcached không dùng được với MariaDB, bạn có tể sử dụng Query Cache để set up database caching với Maria DB.

Vậy bạn có nên chuển sang MariaDB? Công cụ này nguồn mở, nhanh hơn, và nhìn chung, mang lại nhều tính năng tuyệt vời. Nếu bạn đang quản lý site vừa-lớn, tôi rất ủng hộ bạn chuyển sang MariaDB. Nhưng với site nhỏ sử dụng shared hosting rẻ tiền, có lẽ không đáng thời gian và công sức làm như vậy.

Nhìn chung, tôi đánh giá MariaDB còn cao hơn MySQL, đặc biệt vì khảng năng xử lý kết nối của công cụ. Tuy vậy, ta vẫn có cách cải thiện MySQL thông qua việc tối ưu và caching.

WordPress và class `wpdb`

Class `wpdb` trong WordPress là cốt lõi của mọi tương tác database giữa core software và database. Nhiều plugins và themes cũng có sử dụng class này.

Để chống SQL injection attacks, bạn phải luôn nhớ thoát SQL commands. Đã có nhiều trường hợp hacker lợi dụng SQL code dễ tổn thương trong các plugin có tiếng.

Công cụ quản lý Database

Đa phần web host có cung cấp nhiều cách thức truy cập vào database. Thông thường, như với phpMyAdmin là dạng graphic user interface.

phpMyAdmin

phpMyAdmin là công cụ được viết bằng PHP với công dụng xử lý các công việc quản trị của MySQL trên web.

phpMyAdmin, script nguồn mở cho việc quản lý database, đem đến giải pháp đơn giản giúp tối ưu, sủa chữa, import, export và chạy SQL operations trên database; có thể dùng được với cả MySQL lẫn MariaDB.

Navicat

Navicat là công cụ thiết kế và quản lý database cao cấp.

Navicat là công cụ quản lý database hoàn chỉnh. Cùng với tất cả tính năng chuẩn của bất cứ database management tool tốt nào, như import/export, table viewer, tối ưu, sửa chữa, và cả SQL builder/editor cùng object designer. Giống phpMyAdmin, Navicat hoạt động được cả với MySQL lẫn MariaDB.

Understanding How MySQL Works with WordPress

Databases là phần không thể thiếu trong WordPress, là phần trụ cột của site. Databases đảm bảo site chạy trơn tru. Việc bảo trì và tối ưu có thể tiêu tốn nhiều thời gian, nhưng cũng không kém phần đơn giản và dễ dàng khi thực hiện đúng cách.

Advertisements