什麼是索引?
索引用來快速地尋找那些具有特定值的記錄,所有MySQL索引都以B-樹的形式保存。如果沒有索引,執行查詢時MySQL必須從第一個記錄開始掃描整個表的所有記錄,直至找到符合要求的記錄。表裡面的記錄數量越多,這個操作的代價就越高。如果作為搜索條件的列上已經創建了索引,MySQL無需掃描任何記錄即可迅速得到目標記錄所在的位置。如果表有1000個記錄,通過索引查找記錄至少要比順序掃描記錄快100倍。
索引的類型:
普通索引:這是最基本的索引類型,沒唯一性之類的限制。
唯一性索引:和普通索引基本相同,但所有的索引列只能出現一次,保持唯一性。
主鍵:主鍵是一種唯一索引,但必須指定為"PRIMARY KEY"。
全文索引:MYSQL從3.23.23開始支持全文索引和全文檢索。在MYSQL中,全文索引的索引類型為FULLTEXT。全文索引可以在VARCHAR或者TEXT類型的列上創建。
單列索引和多列索引
索引可以是單列索引,也可以是多列索引。對相關列使用索引是提高SELECT操作性能的最佳途徑。
多列索引:
MySQL可以為多個列創建索引。一個索引可以包括15個列。對於某些列類型,可以索引列的前綴。
多列索引可以視為包含通過連接索引列的值而創建的值的排序的數組。
MySQL按這樣的方式使用多列索引:當你在WHERE子句中為索引的第1個列指定已知的數量時,查詢很快,即使你沒有指定其它列的值。
假定表具有下面的結構:
CREATE TABLE test ( id INT NOT NULL,
last_name CHAR(30) NOT NULL,
first_name CHAR(30) NOT NULL,
PRIMARY KEY (id),
INDEX name (last_name,first_name));
name索引是一個對last_name和first_name的索引。索引可以用於為last_name,或者為last_name和first_name在已知范圍內指定值的查詢。因此,name索引用於下面的查詢:
SELECT * FROM test WHERE last_name='Widenius';
SELECT * FROM test WHERE last_name='Widenius' AND first_name='Michael';
SELECT * FROM test WHERE last_name='Widenius' AND (first_name='Michael' OR first_name='Monty');
SELECT * FROM test WHERE last_name='Widenius' AND first_name >='M' AND first_name < 'N';
然而,name索引不用於下面的查詢:
SELECT * FROM test WHERE first_name='Michael';
SELECT * FROM test WHERE last_name='Widenius' OR first_name='Michael';