正確合理的創建MYSQL數據庫索引

寫在前面:索引對查詢的速度有着相當重要的影響,理解索引也是進行數據庫調優的起點。考慮以下狀況,假設數據庫中一個表有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查詢速度很慢時,應該想一想是否能夠建索引。數據庫

索引是快速搜索的關鍵。MySQL索引的創建對於MySQL的高效運行是很重要的。 spa

在數據庫表中,對字段創建索引能夠大大提升查詢速度。假如咱們建立了一個 mytable表:索引

CREATE TABLE mytable(   ID INT NOT NULL,    username VARCHAR(16) NOT NULL  );   咱們隨機向裏面插入了10000條記錄,其中有一條:5555, admin。內存

  在查找username="admin"的記錄 SELECT * FROM mytable WHERE username='admin';時,若是在username上已經創建了索引,MySQL無須任何掃描,即準確可找到該記錄。相反,MySQL會掃描全部記錄,即要查詢10000條記錄。it

索引分單列索引和組合索引。單列索引,即一個索引只包含單個列,一個表能夠有多個單列索引,但這不是組合索引。組合索引,即一個索包含多個列。table

MySQL索引類型包括:class

(1)普通索引 搜索

這是最基本的索引,它沒有任何限制。 程序

建立索引:數據

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)組合索引

相關文章
相關標籤/搜索