本教程將引導您了解索引的基礎知識。 作為 MySQL 系列的一部分,我們將討論 MySQL 索引的特性及其在優化數據庫性能中的作用。 Liquid Web 建議您在對生產級應用程序進行任何更改之前諮詢您的 DBA。

什麼是索引?

索引是一種強大的 MySQL 結構,可用於從常見查詢中獲得最快的響應時間。 MySQL 查詢通過從給定列或列集生成稱為索引的小表來提高效率。這些稱為鍵的列可用於強制唯一性。下面是使用兩列作為鍵的示例索引的簡單可視化。

+------+----------+----------+
| ROW | COLUMN_1 | COLUMN_2 |
+------+----------+----------+
| 1 | data1 | data2 |
+------+----------+----------+
| 2 | data1 | data1 |
+------+----------+----------+
| 3 | data1 | data1 |
+------+----------+----------+
| 4 | data1 | data1 |
+------+----------+----------+
| 5 | data1 | data1 |
+------+----------+----------+

這個類比將 MySQL 索引與本書末尾的索引進行了比較。

查詢使用索引來識別和檢索目標數據,即使是鍵組合。如果沒有索引,則運行相同的查詢將檢查所需數據的所有行。創建索引會創建一個快捷方式,可以顯著減少擴展表中的查詢時間。教科書類比可以提供另一種可視化索引功能的常用方法。

什麼時候啟用索引?

索引僅對經常訪問信息的大型表有用。例如,繼續教科書的類比,索引一個只有 12 頁的兒童童話是沒有意義的。讀這本書找到所有出現的“turtle”這個詞比設置和維護索引,查詢那些索引,然後檢查所有提供的頁面效率更高,它是一個目標。在計算世界中,這些與索引相關的額外任務代表了資源的浪費,這些資源在沒有索引的情況下可以更好地利用。

如果沒有索引,如果表變得非常大,響應時間將受到對這些鈍表的查詢的影響。低效查詢表現為應用程序或網站性能的延遲。這種延遲通常使用 MySQL 的慢查詢日誌功能來識別。有關使用慢查詢日誌記錄功能的更多信息,請參閱本系列的第一篇文章 MySQL 性能:識別長查詢。
當一個巨大的表單到達一個轉折點時,你就會達到應用程序和網站停機的潛力。對不斷增長的數據庫進行定期評估可建立最佳數據庫性能並避免長查詢的固有中斷。

MySQL索引的優缺點

使用 MySQL 索引有利有弊,這裡有一些重要的利弊需要考慮。這些方面幫助您確定索引是否適合您的情況。

數據傳輸速度快,非常適合OLAP。

什麼樣的信息是索引?

選擇要索引的內容可能是索引數據庫中最困難的部分。識別足夠重要的索引和良性索引而不是索引。通常,索引對常見查詢中受 WHERE 子句約束的列最有效。考慮下面的簡化表。

ID, TITLE, LAST_NAME, FIRST_NAME, MAIDEN_NAME, DOB, GENDER, AGE, DESCRIPTION, HISTORY, ETC...

如果您的查詢依賴於使用 LAST_NAME 和 FIRST_NAME 測試 WHERE 子句,則對這兩列進行索引將顯著增加查詢的響應時間。或者,如果您的查詢依賴於簡單的 ID 查找,則 ID 索引會更好。

這些示例只是基本示例,MySQL 內置了幾種類型的索引結構。以下 MySQL 頁面詳細介紹了這些類型的索引,強烈建議任何考慮建立索引的人使用。 MySQL 如何使用索引

什麼是唯一索引?

評估要用作索引鍵的列時要考慮的另一點是是否使用 UNIQUE 約束。 設置 UNIQUE 約束會根據配置的索引鍵強制執行唯一性。與任何其他鍵一樣,它可以是單列或多列的串聯。這個約束的作用是根據配置的key保證表中沒有重複的條目。

UNIQUE 約束提高了寫入速度,但這是實現的負擔。

什麼是主鍵索引?

與 UNIQUE 約束一樣,PRIMARY KEY 用於優化索引。由於此約束,指定的 PRIMARY KEY 不能為空。因此,當在相關表的 InnoDB 存儲引擎上運行時,它提高了性能。這種提升是由於 InnoDB 物理存儲數據的方式,將具有空值的行與鍵中具有值的行不相鄰放置。啟用此約束可確保表中的行是為了更快的響應。

對於大型表,主鍵索引是絕對必要的。

管理索引

管理索引的關鍵字:dbName、tableName、indexName

下面描述了使用 MySQL 語法處理索引的一些基礎知識。此示例包括索引、刪除和列出。請注意,這些示例具有特定關鍵字的佔位符條目。這些關鍵字本質上是微不足道且易於閱讀的,如下所述。

您可以使用 dbName.tableName 代替 tableName。

列表/查看索引

一個表可以有多個索引。管理索引不可避免地需要能夠列出表中現有索引的能力。顯示索引的語法是:

SHOW INDEX FROM tableName;

顯示表名的索引。顯示所有索引。

該索引位於三個不同的列中。

創建索引

索引是一種簡單的語法。挑戰在於確定需要索引哪些列以及是否需要強制執行唯一性。下面介紹如何創建有和沒有 PRIMARY KEY 和 UNIQUE 約束的索引。

如前所述,一個表可以包含多個索引。多個索引可幫助您創建與應用程序或網站所需的查詢相協調的索引。默認設置允許每個表最多 16 個索引。增加這個數字,但通常超過必要。可以在創建表期間創建索引,也可以稍後將其作為附加索引添加到表中。下面介紹這兩種方法。

創建太多索引會增加延遲,但如果您需要在 MySQL 配置中增加緩衝區。

示例:使用標準索引創建表

您可以使用 ID 作為索引來索引多個列。

CREATE TABLE tableName (
ID int,
LName varchar(255),
FName varchar(255),
DOB varchar(255),
LOC varchar(255),
INDEX ( ID )
);

示例:創建具有唯一索引和主鍵的表

您可以在多個列上創建主鍵和唯一約束。

CREATE TABLE tableName (
ID int,
LName varchar(255),
FName varchar(255),
DOB varchar(255),
LOC varchar(255),
PRIMARY KEY (ID),
UNIQUE INDEX ( ID )
);

示例:向現有表添加索引

CREATE INDEX 語句創建一個索引並為其命名。

CREATE INDEX indexName ON tableName (ID, LName, FName, LOC);

示例:使用主鍵向現有表添加索引

CREATE UNIQUE 命令可以為表添加索引,以確保沒有重複數據。

CREATE UNIQUE INDEX indexName ON tableName (ID, LName, FName, LOC);

刪除索引

管理索引時,可能需要刪除一些索引。刪除索引也是一個非常簡單的過程。請參閱以下示例。

您可以使用 DROP INDEX 命令刪除特定列上的索引。

DROP INDEX indexName ON tableName;

您需要了解的有關高可用性的所有信息

有很多方法可以優化您的數據庫以獲得真正的效率。 如果您想了解更多關於或轉換 MySQL 中可用的搜索引擎類型,請閱讀 MyISAMwithInnoDB 教程。或者,如果您需要高性能數據庫,請查看 MySQL 產品頁面以了解不同的選項。