MySQL 中檢查索引的方法:從基礎到進階的完整指南

1. 介紹

在資料庫的運作中,搜尋速度的優化是重要的課題。其解決方案之一就是「索引」的活用。索引是為了加速資料庫中的資料搜尋而不可或缺的功能。本文將使用 MySQL 來確認索引的方法,從基礎到應用進行說明。

本文可學到的事項

  • 索引的基本機制及其種類
  • MySQL 中的索引確認方法(SHOW INDEX 或 EXPLAIN 指令的具體範例)
  • 索引的適當管理和維護方法
  • 有關索引的常見疑問及其解決方案

索引如果適當活用,能大幅提升資料庫的效能。但是,不適當的設定或運作反而會降低整個系統的效能。透過本文,從索引的基本到應用進行掌握,並用於改善資料庫運作。

2. 索引的基本知識

索引是為了效率化資料庫搜尋而設計的機制,在資料管理中扮演非常重要的角色。本節將說明索引的基本機制、種類,以及優點與挑戰。

索引是什麼?

索引是設定在資料庫內特定欄位上的「索引」類似物。藉此,提升資料的搜尋速度。類似書籍的目錄角色,用來有效率地找出必要資訊。

例如,沒有索引的情況下,資料庫需要依序確認搜尋對象的所有資料(全表掃描)。另一方面,若設定了索引,只需循著索引結構即可迅速存取目的資料。

索引的種類

  1. 主鍵索引(PRIMARY KEY)
    主鍵上自動設定的索引。保證各行唯一識別,每個表格僅存在一個。
  2. 唯一索引(UNIQUE)
    保證指定欄位的值唯一。不允許相同值的資料時使用。
  3. 全文索引(FULLTEXT)
    為了高速化文字搜尋的索引。主要在進行全文搜尋時活用。
  4. 複合索引
    也可以組合多個欄位來建立索引。
    例: nameage的兩者基於搜尋條件,設定複合索引可提升速度。

索引的優點與挑戰

優點

  1. 搜尋速度的提升
    資料搜尋或基於特定條件的抽出會高速化。
  2. 查詢效率的改善
    WHERE子句、JOIN、ORDER BY等的處理速度大幅改善。

挑戰

  1. 資料更新時效能降低
    由於需要更新索引,INSERT、UPDATE、DELETE操作可能變慢。
  2. 儲存空間消耗
    索引需要額外的儲存空間,大規模索引會壓迫磁碟容量。

3. 在 MySQL 中的索引確認方法

MySQL 中,為了確認索引的狀態,準備了幾種方法。本節將以具體範例說明三種代表性的方法:「SHOW INDEX 命令」、「INFORMATION_SCHEMA.STATISTICS 表格」和「EXPLAIN 命令」。

使用 SHOW INDEX 命令的確認方法

SHOW INDEX 命令是用來確認表格中設定的索引詳細的基本命令。

基本語法

SHOW INDEX FROM 表格名稱;

執行範例

例如,確認 users 表格的索引時,如下執行。

SHOW INDEX FROM users;

結果範例

TableNon_uniqueKey_nameSeq_in_indexColumn_nameCollationCardinalityIndex_typeComment
users0PRIMARY1idA1000BTREE 
users1idx_name1nameA500BTREE 
輸出結果的項目說明
  • Key_name: 索引的名稱。
  • Non_unique: 唯一性(0 表示唯一,1 表示非唯一)。
  • Column_name: 索引設定的欄位名稱。
  • Cardinality: 索引中唯一值的估計數。
  • Index_type: 索引的種類(通常是 BTREE)。

使用 INFORMATION_SCHEMA.STATISTICS 的確認方法

INFORMATION_SCHEMA.STATISTICS 是儲存資料庫中索引資訊的系統表格。

基本語法

SELECT * FROM INFORMATION_SCHEMA.STATISTICS 
WHERE table_schema = '資料庫名稱' 
AND table_name = '表格名稱';

執行範例

確認 my_databaseusers 表格相關的索引資訊時:

SELECT * FROM INFORMATION_SCHEMA.STATISTICS 
WHERE table_schema = 'my_database' 
AND table_name = 'users';

結果範例(摘錄)

TABLE_SCHEMATABLE_NAMEINDEX_NAMECOLUMN_NAMEINDEX_TYPE
my_databaseusersPRIMARYidBTREE
my_databaseusersidx_namenameBTREE

此方法在有效取得特定資料庫或跨多個表格的索引資訊時很有用。

使用 EXPLAIN 命令的確認方法

EXPLAIN 命令是用來確認 SQL 查詢的執行計劃,並分析索引如何被使用的工具。

基本語法

EXPLAIN 查詢;

執行範例

確認下列查詢的執行計劃。

EXPLAIN SELECT * FROM users WHERE name = 'Alice';

結果範例

idselect_typetabletypepossible_keyskeykey_lenrefrowsExtra
1SIMPLEusersrefidx_nameidx_name102const1Using index
輸出結果的項目說明
  • key: 實際使用的索引名稱。
  • possible_keys: 可使用的索引。
  • rows: 預測的掃描行數。
  • Extra: 索引的使用情況或附加資訊。

總結

在 MySQL 中,可以使用 SHOW INDEX、INFORMATION_SCHEMA.STATISTICS 和 EXPLAIN 命令來確認索引的狀態或在查詢中的使用情況。由於各方法有其特性,請依用途選擇適當的方法。

4. 索引的管理

MySQL 中適當管理索引對於資料庫的有效運作是不可或缺的。本節將詳細說明索引的建立、刪除以及最佳化的方法。

索引的建立

基本語法

索引是使用CREATE INDEX語句來建立的。

CREATE INDEX 索引名稱 ON 資料表名稱(欄位名稱);

執行範例

例如,在users資料表的email欄位建立索引時:

CREATE INDEX idx_email ON users(email);

複合索引的建立

也可以結合多個欄位來建立索引。

CREATE INDEX idx_name_email ON users(name, email);

使用複合索引,可以有效化多個搜尋條件。

索引的刪除

基本語法

不再需要的索引可以使用DROP INDEX語句來刪除。

DROP INDEX 索引名稱 ON 資料表名稱;

執行範例

例如,從users資料表刪除idx_email索引時:

DROP INDEX idx_email ON users;

透過刪除索引,可以減少不必要的儲存空間使用,並提升資料更新時的效能。

索引的最佳化與維護

特定使用頻率低的索引

使用頻率低的索引可能會成為資料庫的負擔。使用以下查詢來確認索引的使用情況。

SELECT * FROM INFORMATION_SCHEMA.STATISTICS 
WHERE table_schema = '資料庫名稱' 
AND table_name = '資料表名稱';

刪除冗餘索引

如果相同的欄位設定多個索引,透過刪除它們可以改善效率。

工具的使用範例

使用 Percona Toolkit 來自動偵測冗餘索引。

pt-duplicate-key-checker --host=localhost --user=root --password=yourpassword

解決索引的片段化

如果索引片段化,效能會降低。在這種情況下,透過重建索引可以期待改善。

ALTER TABLE 資料表名稱 ENGINE=InnoDB;

摘要

索引的管理不僅僅是建立或刪除,還需要最佳化和定期維護。透過適當的管理,可以維持資料庫的效能,並實現有效的運作。

5. 常見問題 (FAQ)

MySQL 的索引相關疑問是許多人會遇到的重點。本節中,我們彙整了關於索引的常見問題及其解答。透過閱讀這些內容,您將能更深入了解索引的機制與運作方式。

索引未被使用的理由是?

即使已設定索引,查詢仍可能未使用索引。以下顯示其主要理由與對策。

主要理由

  1. 查詢描述錯誤
    在查詢中使用無法活用索引的語法(例如:LIKE '%keyword%' 這類前方不一致的情況)。
  2. 資料型態不一致
    查詢中指定的值資料型態與索引設定時的欄位資料型態不同時。
  3. 小型表格
    資料庫判斷全表掃描更有效率時。

解決方案

  • 使用 EXPLAIN 指令
    確認執行計劃,檢查是否使用了索引。
EXPLAIN SELECT * FROM users WHERE name = 'Alice';
  • 最佳化查詢
    修正條件式,使其能活用索引。

建立複合索引時需注意的事項是?

複合索引能加速多重條件的搜尋,但需掌握建立時的注意點。

注意點

  1. 欄位順序很重要
    將搜尋條件中頻繁使用的欄位置於前方。例如:WHERE name = 'Alice' AND age > 25 的情況下,將 name 置於前方。
  2. 範圍條件置後
    包含範圍條件(例如:age > 30)時,將其置於後方。
  3. 避免過度複合索引
    包含使用頻度低的欄位,可能導致效能下降。

索引導致效能下降的情況是?

索引大多有益,但在某些情況下可能導致效能下降。

主要原因

  1. 索引過度設定
    建立過多不必要的索引,會在資料插入・更新時增加額外負荷。
  2. 碎片化的影響
    索引碎片化會導致搜尋速度下降。
  3. 重複索引
    對相同欄位建立多個索引會造成冗餘,浪費資源。

對策

  • 刪除未使用的索引。
  • 定期重建索引。

確認索引有效性的方法是?

要驗證索引是否有效運作,可使用以下方法。

  1. 利用 EXPLAIN 指令
    確認執行計劃,檢查 key 欄位是否顯示索引名稱。
  2. 活用查詢效能結構描述
    使用 MySQL 的效能結構描述,詳細分析索引的使用情況。
  3. 使用效能監控工具
    活用 Percona Toolkit 等工具,診斷索引的效能。

索引的最佳數量是?

索引的數量依用途與表格性質而異,但請考慮以下重點。

重點

  • 以頻繁使用的查詢為基準設計
    僅建立特定查詢所需的索引。
  • 更新頻度高的表格應保持最小限
    為了減輕資料更新的負荷,僅保留必要的最低限度索引。

6. 總結

MySQL 的索引是大幅提升資料庫搜尋效率的重要元素。本文從索引的基本原理到應用、具體的管理方法以及常見問題的解答,系統性地說明了。

回顧文章的重點

  1. 索引的基本機制與種類
  • 索引作為資料庫的「索引」功能,能提升搜尋效率。
  • 主鍵索引、唯一索引、全文字索引、複合索引等,根據用途存在各種種類。
  1. MySQL 中的索引確認方法
  • 使用 SHOW INDEX 或 EXPLAIN 指令,即可輕鬆確認索引的狀態或查詢的使用情況。
  • 活用 INFORMATION_SCHEMA.STATISTICS 表格,即可取得更詳細的資訊。
  1. 索引的管理與最佳化
  • 適當建立與刪除必要的索引,不僅能提升搜尋效率,同時也能減輕更新負荷。
  • 刪除多餘的索引或解決碎片化也很重要。
  1. 有關索引的常見問題
  • FAQ 區段回答了索引未被使用的理由、複合索引的注意事項等實務上的疑問。

下一步驟

  1. 確認目前資料庫的索引狀況
    使用 SHOW INDEX 或 EXPLAIN 調查表格中設定的索引吧。
  2. 執行效能最佳化
    找出使用頻率低的索引或多餘的索引,視需要刪除。
  3. 實踐適當的索引設計
    以經常使用的查詢為基礎,建立或調整索引。
  4. 活用所學知識
    以本文所學的知識為基礎,推進資料庫運用的效率化。

最後

索引的適當運用不僅能提升資料庫的效能,還能提高系統整體的效率。然而,過度設定索引或不適當的設計反而會成為降低效能的因素。以本文為參考,進一步磨練索引的運用技能,目標是穩定的資料庫運用吧。