寫在前面:索引對查詢的速度有着相當重要的影響,理解索引也是進行數據庫調優的起點。考慮以下狀況,假設數據庫中一個表有10^6條記錄,DBMS的頁面大小爲4K,並存儲100條記錄。若是沒有索引,查詢將對整個表進行掃描,最壞的狀況下,若是全部數據頁都不在內存,須要讀取10^4個頁面,若是這10^4個頁面在磁盤上隨機分佈,須要進行10^4次I/O,假設磁盤每次I/O時間爲10ms(忽略數據傳輸時間),則總共須要100s(但實際上要好不少不少)。若是對之創建B-Tree索引,則只須要進行log100(10^6)=3次頁面讀取,最壞狀況下耗時30ms。這就是索引帶來的效果,不少時候,當你的應用程序進行SQL查詢速度很慢時,應該想一想是否能夠建索引。html
索引是快速搜索的關鍵。MySQL索引的創建對於MySQL的高效運行是很重要的。 數據庫
在數據庫表中,對字段創建索引能夠大大提升查詢速度。假如咱們建立了一個 mytable表:spa
CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL ); 咱們隨機向裏面插入了10000條記錄,其中有一條:5555, admin。.net
在查找username="admin"的記錄 SELECT * FROM mytable WHERE username='admin';時,若是在username上已經創建了索引,MySQL無須任何掃描,即準確可找到該記錄。相反,MySQL會掃描全部記錄,即要查詢10000條記錄。htm
索引分單列索引和組合索引。單列索引,即一個索引只包含單個列,一個表能夠有多個單列索引,但這不是組合索引。組合索引,即一個索包含多個列。blog
MySQL索引類型包括:索引
(1)普通索引 內存
這是最基本的索引,它沒有任何限制。 get
建立索引:table
CREATE INDEX indexName ON mytable(username(length));若是是CHAR VARCHAR類型,length能夠小於字段實際長度;若是是BLOB和TEXT類型,必須指定 length,下同。
刪除索引:
DROP INDEX [indexName] ON mytable;
(2)惟一索引
它與前面的普通索引相似,不一樣的就是:索引列的值必須惟一,但容許有空值。若是是組合索引,則列值的組合必須惟一。
建立索引:
CREATE UNIQUE INDEX indexName ON mytable(username(length));
(3)主鍵索引
它是一種特殊的惟一索引,不容許有空值。通常是在建表的時候同時建立主鍵索引:
CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, PRIMARY KEY(ID) );
(4)組合索引