為什麼需要Index
數據庫中的索引類似於您在書中開頭的目錄。如果一本書有目錄,你可以在書中輕鬆找到你想要看的章節。另一方面,如果一本書中沒有目錄,則必須花費更多時間翻來翻去,從第一頁開頭到結尾的每頁來查找你想要的資料。
SQL的原理也是一樣的,當您網站數據庫中的資料越多,SQL的查詢就會越來越長,適當的增加索引可以增加查詢數據的效率。
WordPress 跟SQL索引的關係
由於主題(Theme)和插件(Plugin)裡面的數據與設定大部分都儲存在wp_options表中,會導致該數據表肥大,增加SQL查詢時間而讓WordPress 後台(wp-admin)載入時而變緩慢。如果主題(Theme)或是插件(Plugin)內有大量的設定,或是比較消耗內存快取,目前有兩種方式可以加快後台速度:
- 使用object cache 如 Redis 、Memcached 等等,把數據快取到RAM,增加反應速度
- 在SQL中的 wp_options 表新增索引,在quary的過程中時間變短;增加索引的原理類似於一般書籍的目錄頁。
測試與實作
以下是我測試過程與如何優化的紀錄,若您要執行SQL操作,務必記得再執行前,記得三步驟暖身操:備份、備份、再備份。
首先找出wp_options是否存在任何索引:
SHOW INDEX FROM wp_options;
A.回傳值若如下,則表示沒有索引:
Table| Non_unique |Key_name|Seq_in_index| Column_name | Collation |----------------|------------------|--------------------|---------------------|----------------------|-------------|wp_options |0 | PRIMARY|1 | option_id| A|................................................wp_options |0 | option_name|1 | option_name| A|
B.如果你看到一個Column_name值為autoload 或類似的索引,那麼你已經有了一個索引。
Table| Non_unique |Key_name|Seq_in_index| Column_name | Collation |----------------|------------------|--------------------|---------------------|----------------------|-------------|wp_options |0 | PRIMARY|1 | option_id| A|................................................wp_options |0 | option_name|1 | option_name| A|wp_options |0 | autoload|4 | autoload| A|
在wp_options
數據表中比較autoload = yes
與autoload = no
的數量,先找出多少數據表已加載:
SELECT COUNT(CASE WHEN autoload = 'yes' THEN 1 END) FROM wp_options;
再找出有多少沒有自動加載autoload = no
:
SELECT COUNT(CASE WHEN autoload = 'no' THEN 1 END) FROM wp_options;
autoload = no
選項數量大大超過autoload = yes
選項,務必要做索引;若低於60%的option_name
值是autoload = no
,則可不用索引,執行效率不會提高。
如果您決定要加入索引,MySQL語法如下:
CREATE INDEXON (, );
試例增加wp_options索引,語法如下:
CREATE INDEX autoloadindex ON wp_options(autoload, option_name);
再回到第一步,查看索引是否有增加。
如果想要刪除索引語法如下:
DROP INDEX autoloadindex ON wp_options
參考資料:
w3schools – SQL CREATE INDEX Statement
圖片來源:pexels.com