這篇文章,主要是和大家一起去了解 索引,然后一起使用CREATE INDEX語法給數據庫中的表創建一個索引。
一:先拿電話薄做個類比
假如,一個電話薄里面包含了一個城市的所有人的姓名和電話號碼。那么,想找到Bob Cat的電話號碼,另外我們知道電話簿中名字是按照字母順序排列的,所以首先要查找姓氏為Cat的頁面,然后在這個頁面下查找名字為Bob的電話號碼。
那如果在電話薄中的名字沒有按照字母排列,就需要去瀏覽所有的頁,然后在里面查找每個姓名直到找到Bob Cat,這種是查找了所有的電話頁,所以在時間上還是挺費時的。
那我們將電話簿與數據庫表聯系起來,如果有一個電話簿表然后要找到Bob Cat的電話號碼,則可以執行以下查詢:
SELECT
phone_number
FROM
phone_book
WHERE
first_name = 'Bob' AND
last_name = 'Cat';
這個寫起來很容易,在數據量不大的時候查詢速度很快,但數據庫必須掃描表的所有行,直到找到該行為止,如果表有數百萬行而沒有索引時,則檢索數據會耗費很多的時間。
二:索引的介紹
索引是一種數據結構,例如B-Tree,這種數據結構是需要額外的寫入和存儲為代價來提高表上數據檢索的速度。一旦建立了索引后,數據庫中查詢優化器使用索引來快速定位數據,然后就無需掃描表中給定查詢的每一行了。
其中。當使用主鍵或唯一鍵創建表時,MySQL會自動創建名為PRIMARY的特殊索引, 該索引稱為聚簇索引。PRIMARY索引是比較特殊的,這個索引本身與數據一起存儲在同一個表中。另外除PRIMARY索引之外的其他索引稱為二級索引或非聚簇索引。
三:MySQL CREATE INDEX語句
通常,創建表的時候就能為表創建索引。 例如,以下語句創建一個新表,並創建了是由兩列c2和c3組成的索引。
CREATE TABLE t( c1 INT PRIMARY KEY, c2 INT NOT NULL, c3 INT NOT NULL, c4 VARCHAR(10), INDEX (c2,c3) );
但是要為列或一組列添加索引,可以使用CREATE INDEX語句,如下所示:
CREATE INDEX index_name ON table_name (column_list)
要為列創建索引,要指定索引名稱,索引所屬的表以及列。
例如,要為列c4添加新索引,請使用以下語句:
CREATE INDEX idx_c4 ON t(c4);
默認情況下,如果未指定索引類型,MySQL將創建B-Tree索引。 以下顯示了基於表的存儲引擎的允許索引類型:

四:MySQL CREATE INDEX 舉例
以下語句查找職位為Sales Rep的員工:
SELECT
employeeNumber,
lastName,
firstName
FROM
employees
WHERE
jobTitle = 'Sales Rep';

這里數據返回了17行,表明17名員工的職位是銷售代表。
那我們要查看MySQL如何在內部執行此查詢,可以在 SELECT語句的開頭添加 EXPLAIN子句,會得到下面的結果:

可以看到,MySQL必須掃描包含23行的整個表,以查找具有Sales Rep職位的員工。
現在,讓我們使用CREATE INDEX語句為jobTitle列創建一個索引:
CREATE INDEX jobTitle ON employees(jobTitle);
並再次執行上述語句:
EXPLAIN SELECT
employeeNumber,
lastName,
firstName
FROM
employees
WHERE
jobTitle = 'Sales Rep';

這時候看到,MySQL只需要在鍵列中指示的jobTitle索引中找到17行而不掃描整個表。
如果要顯示表的索引,可以使用下SHOW INDEXES語句,例如:
SHOW INDEXES FROM employees;
返回結果如下的索引

這篇文章中我們介紹了MySQL索引以及如何為表中的列添加索引,希望大家可根據文末提供的數據源來自己敲寫代碼
作者:數據蛙datafrog
鏈接:https://www.jianshu.com/p/f588c41f1cb5
來源:簡書