問題描述
希望對 WordPress 數據庫中優化和保持最佳性能的一些反饋,以繪製圖片…. 讓我們説你有一個 WordPress /Buddypress MU 網站,開始在大約 150kb(香草安裝) … 隨着時間的推移,用户添加博客,論壇,帖子和評論,數據庫增長到 5mb …. 然後是明年的 10mb …. 還假設主機控件是標準的共同設置,如 Cpanel 或 Plesk 。
-
數據庫中的條目數量會影響 front-end 網站的性能?
-
作為網站管理員,您可以做些什麼,以便隨着數據庫的增長而保持運行順暢?
-
你的數據庫在 500 – 600mb 大之後,在第 5 年後的表現可以期待什麼?
感謝您對保持緊密船舶的任何反饋。
問候,
S.
最佳解決方案
您的具體問題:
1) 在性能受影響之前,DB 可能包含的 「條目數」 沒有嚴格的限制。性能取決於您的硬件和配置,就像在 DB 的大小和結構上一樣。
2) 如果您擔心數據庫層的可擴展性,可以在集羣中或在允許調整大小的雲端框或 VPS 上運行它。如果您的數據庫開始緩慢,您可以調整大小 (通常是額外的費用) 。這些選項增加了成本,但確實是確保 DB 的可擴展性的最佳方式。
3) 這取決於你的主機設置和你的數據庫架構。但一般來説 (除非你是一個非常便宜的盒子),我不用擔心一個 30MB 的 WordPress 數據庫。 WordPress 做好索引表的工作,甚至一個 OOB MySQL 配置也可以輕鬆處理這個大小的 DB 上的 WordPress 查詢。當您達到千兆字節時 – 那就是您可能需要認真考慮性能優化選項。
一般來説:
如果您擔心性能問題,請專注於調整現有的 MySQL 設置和/或設置緩存層。緩存可以大大減輕 MySQL 的負擔 (特別是對於 WordPress 站點,因為它們通常執行大量的數據庫查詢) 。
如果您已經正確調整 MySQL 並設置了一個體面的緩存層,那麼您仍然擔心會出現硬件配置問題,您可以在 x 時間之後設置刪除內容的策略。
這些東西都不是特定於 WordPress 的。而且我不確定該問題有什麼答案不適用於在 LAMP 堆棧上運行的任何網站或應用程序。但也許有人有關於 MU 表結構或其他 WP-specific DB 技巧的建議… 我不知道。
次佳解決方案
嚴格來説,從 MySQL Point-of-View,我有建議如何改進 MySQL 實例數據/索引的緩存。
請記住,MySQL 有兩個主要的存儲引擎
-
MyISAM 數據
-
InnoDB 的
他們的緩存機制是不同的。有一些你可以做的,以調整您選擇的存儲引擎。
MyISAM
MyISAM 只緩存索引頁。它從不緩存數據。您可以做兩件事來改善 MyISAM 表的 I /O 。
MyISAM 改進#1
具有 VARCHAR 列的任何 MyISAM 表都可以內部轉換為 CHAR 而不用觸摸初始設計。假設你有一個名為 mydb.mytable 的表,並且您希望改進它的 I /O,請執行以下操作:
ALTER TABLE mydb.mytable ROW_FORMAT=Fixed;
這將增加表 60%-100%的大小,但是在不改變任何東西的情況下,I /O 的性能將會提高 20-30%。我之前在 DBA StackExchange 中寫過這個:
MyISAM 改進#2
您需要增加 MyISAM 密鑰緩存 (按照 key_buffer_size 的大小) 。請運行此查詢:
SELECT CONCAT(ROUND(KBS/POWER(1024,
IF(PowerOf1024<0,0,IF(PowerOf1024>3,0,PowerOf1024)))+0.4999),
SUBSTR(' KMG',IF(PowerOf1024<0,0,
IF(PowerOf1024>3,0,PowerOf1024))+1,1))
recommended_key_buffer_size FROM
(SELECT LEAST(POWER(2,32),KBS1) KBS
FROM (SELECT SUM(index_length) KBS1
FROM information_schema.tables WHERE engine='MyISAM' AND
table_schema NOT IN ('information_schema','mysql','performance_schema')) AA ) A,
(SELECT 2 PowerOf1024) B;
這將顯示您基於您當前數據集的理想 key_buffer_size 。
InnoDB
InnoDB 緩存數據和索引。如果您將所有數據轉換為 InnoDB,並且目前正在從所有 InnoDB 數據庫運行 WordPress,則需要將 InnoDB 緩衝池 (使用 innodb_buffer_pool_size 調整大小) 。請運行此查詢:
SELECT CONCAT(ROUND(KBS/POWER(1024,
IF(PowerOf1024<0,0,IF(PowerOf1024>3,0,PowerOf1024)))+0.49999),
SUBSTR(' KMG',IF(PowerOf1024<0,0,
IF(PowerOf1024>3,0,PowerOf1024))+1,1)) recommended_innodb_buffer_pool_size
FROM (SELECT SUM(data_length+index_length) KBS FROM information_schema.tables
WHERE engine='InnoDB') A,
(SELECT 2 PowerOf1024) B;
這將顯示您基於您當前數據集的理想 key_buffer_size 。
Projections
如果您預計數據集將增長 20 倍,則只有多個此查詢建議的建議 20 。假設您的 MyISAM 數據集是 15MB,3MB 是索引的總和。如果您估計有 20 倍的數據,請將 key_buffer_size 設置為 60MB,如/etc/my.cnf 所示:
[mysqld]
key_buffer_size=60M
然後重新啓動 MySQL 。同樣的事情將適用於 InnoDB 緩衝池。
如果您的所有數據都是 InnoDB,則需要對 StackOverflow 中發佈的 InnoDB 基礎架構執行完整的清理。
參考文獻
注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。