MySQL 性能:如何利用 MySQL 數據庫索引


本教程涵蓋了索引的基礎知識。 作為 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 索引與書後的索引進行了比較。

查詢使用索引來識別和檢索目標數據,甚至是鍵組合。如果沒有索引,運行相同的查詢會檢查每一行是否有我想要的數據。創建索引提供了一種快捷方式,可以大大減少對擴展表的查詢時間。教科書類比可以提供另一種可視化索引功能的一般方式。

何時啟用索引?

索引僅對經常訪問信息的大型表有用。例如,繼續教科書的類比,索引一本只有十幾頁左右的兒童繪本是沒有意義的。與其建立和維護索引、查詢這些索引,然後瀏覽所有提供的頁面,不如閱讀本書找到所有出現的單詞“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 中可用的搜索引擎類型的更多信息,或者想要轉換,請閱讀 MyISAM 和 InnoDB 教程。或者,如果您想要一個高性能數據庫,請查看我們的 MySQL 產品頁面以查看一系列選項。