Mysql創建索引

零:文章概要

這篇文章,主要是和大家一起去了解 索引,然後一起使用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索引以及如何爲表中的列添加索引,希望大家可根據文末提供的數據源來自己敲寫代碼

翻譯參考:

1.Mysql創建索引
2.文章使用的數據源

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章