為什麼需要Index

數據庫中的索引類似於您在書中開頭的目錄。如果一本書有目錄,你可以在書中輕鬆找到你想要看的章節。另一方面,如果一本書中沒有目錄,則必須花費更多時間翻來翻去,從第一頁開頭到結尾的每頁來查找你想要的資料。

SQL的原理也是一樣的,當您網站數據庫中的資料越多,SQL的查詢就會越來越長,適當的增加索引可以增加查詢數據的效率。

 

WordPress 跟SQL索引的關係

由於主題(Theme)和插件(Plugin)裡面的數據與設定大部分都儲存在wp_options表中,會導致該數據表肥大,增加SQL查詢時間而讓WordPress 後台(wp-admin)載入時而變緩慢。如果主題(Theme)或是插件(Plugin)內有大量的設定,或是比較消耗內存快取,目前有兩種方式可以加快後台速度:

  1. 使用object cache 如 Redis 、Memcached 等等,把數據快取到RAM,增加反應速度
  2. 在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 = yesautoload = 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