1. 程式人生 > >MySQL學習之(七)索引

MySQL學習之(七)索引

索引 —— 是一種提高查詢速度的機制

索引用來快速地尋找那些具有特定值的記錄,如果沒有索引,執行查詢時MySQL必須從第一個記錄開始掃描整個表的所有記錄,直至找到符合要求的記錄。表裡面的記錄數量越多,這個操作的代價就越高。

索引提供指標以指向儲存在表中指定列的資料值,然後根據指定的排序次序排列這些指標。資料庫使用索引的方式與使用書的目錄很相似:通過搜尋索引找到特定的值,然後跟隨指標到達包含該值的行。

如果作為搜尋條件的列上已經建立了索引,MySQL無需掃描任何記錄即可迅速得到目標記錄所在的位置。如果表有1000個記錄,通過索引查詢記錄至少要比順序掃描記錄快100倍。

1.索引機制

學生表student中建立“學號”索引(升序)示意圖

沒有索引檔案時:

如果要找位於第10000條的學號”20070201”的記錄, 計算機要在表中查詢10000次

有索引檔案時:(二分法查詢例項)

   計算機先在索引檔案中學號為”20070201”的記錄,找到相應的記錄號,再到學生表中直接讀取相關記錄.

索引檔案如何加快查詢速度?

原因:

 (1)索引後,指標在索引檔案中順序移動。

 (2)索引檔案中記錄是有序的。

 (3)有序後,可以用各種方法加快查詢速度,如折半(二分)查詢法,而排序前,只能順序查詢記錄。

樹索引示意圖

2.索引的分類

1.  普通索引(INDEX)

這是最基本的索引型別,它沒有唯一性之類的限制。建立普通索引的關鍵字是INDEX。

2.  唯一性索引(UNIQUE)

這種索引和前面的普通索引基本相同,但有一個區別:索引列的所有值都只能出現一次,即必須是唯一的。建立唯一性索引的關鍵字是UNIQUE。

3.  主鍵(PRIMARY KEY)

主鍵是一種唯一性索引,它必須指定為“PRIMARY KEY”。主鍵一般在建立表的時候指定,也可以通過修改表的方式加入主鍵。但是每個表只能有一個主鍵。

4.  全文索引(FULLTEXT)

MySQL支援全文檢索和全文索引。全文索引的索引型別為FULLTEXT。全文索引只能在VARCHAR或TEXT型別的列上建立,並且只能在MyISAM表中建立。

3、索引建立

①使用CREATE INDEX語句

使用CREATE INDEX語句可以在一個已有表上建立索引,一個表可以建立多個索引。

語法格式:

CREATE [UNIQUE | FULLTEXT] INDEX 索引名

ON 表名(列名[(length)] [ASC | DESC],...)

說明:

●索引名:索引的名稱,索引名在一個表中名稱必須是唯一的。

● 列名:表示建立索引的列名。

  length表示使用列的前length個字元建立索引。使用列的一部分建立索引可以使索引檔案大大減小,從而節省磁碟空間。BLOB或TEXT列必須用字首索引。

● UNIQUE:UNIQUE表示建立的是唯一性索引

● FULLTEXT:FULLTEXT表示建立全文索引;

● CREATE INDEX 語句並不能建立主鍵。

例:

根據Book表的書名列上的前6個字元建立一個升序索引name­_book。

      CREATE INDEX  name­_book

      ON   Book(書名(6)  ASC);

可以在一個索引的定義中包含多個列,中間用逗號隔開,但是它們要屬於同一個表。這樣的索引叫做複合索引

②使用ALTER TABLE語句

使用ALTER TABLE語句修改表,其中也包括向表中新增索引。

語法格式如下:

   ALTER TABLE 表名

       ADD INDEX [索引名] (列名,...)           /*新增索引*/

      | ADD PRIMARY KEY [索引方式] (列名,...)  /*新增主鍵*/

      | ADD UNIQUE [索引名] (列名,...)   /*新增唯一性索引*/

      | ADD FULLTEXT [索引名] (列名,...)   /*新增全文索引*/

例:

假設Book表中主鍵未設定,為Book表建立以圖書編號為主鍵索引,出版社和出版時間為複合索引,以加速表的檢索速度。

    ALTER TABLE Book

ADD PRIMARY KEY(圖書編號),

ADD INDEX mark(出版社,出版時間);

     這個例子中,既包括PRIMARY KEY,也包括複合索引,說明MySQL可以同時建立多個索引。記住,使用PRIMARY KEY的列,必須是一個具有NOT NULL屬性的列。

如果想要查看錶中建立的索引的情況,可以使用SHOW INDEX FROM tbl_name語句,例如:SHOW INDEX FROM book;

③建立表時建立索引

在前面兩種情況下,索引都是在表建立之後建立的。索引也可以在建立表時一起建立。在建立表的CREATE TABLE語句中可以包含索引的定義。

語法格式:

     CREATE TABLE 表名 ( 列名, ... | [索引項])

其中,索引項語法格式如下:

       PRIMARY KEY (列名,...)                   /*主鍵*/

     | {INDEX | KEY} [索引名] (列名,...)       /*索引*/

     | UNIQUE [INDEX] [索引名] (列名,...)     /*唯一性索引*/

     | [FULLTEXT] [INDEX] [索引名] (列名,...)  /*全文索引*/

說明:KEY通常是INDEX的同義詞。在定義列選項的時候,也可以將某列定義為PRIMARY KEY,但是當主鍵是由多個列組成的多列索引時,定義列時無法定義此主鍵,必須在語句最後加上一個PRIMARY KEY列名,…)子句。

例:

建立sell_copy表的語句如下,sell_copy錶帶有身份證號和圖書編號的聯合主鍵,並在訂購冊數列上建立索引。

    CREATE TABLE sell_copy (

身份證號   CHAR(18) NOT NULL,

圖書編號   CHAR(20) NOT NULL,

訂購冊數   INT(5),

訂購時間   DATETIME

,PRIMARY KEY(身份證號, 圖書編號),

INDEX dgcs(訂購冊數)

     );

4、刪除索引

①使用DROP INDEX語句刪除索引

語法格式:

           DROP INDEX索引名 ON 表名

例:

刪除Book表上的sm_book索引。

        DROP INDEX sm_book ON Book;

②使用ALTER TABLE語句刪除索引

語法格式:

    ALTER [IGNORE] TABLE 表名

        | DROP PRIMARY KEY        /*刪除主鍵*/

        | DROP INDEX 索引名    /*刪除索引*/

【例】刪除Book表上的主鍵和mark索引。

     ALTER TABLE Book

 DROP PRIMARY KEY,

 DROP INDEX mark;

如果從表中刪除了列,則索引可能會受到影響。如果所刪除的列為索引的組成部分,則該列也會從索引中刪除。如果組成索引的所有列都被刪除,則整個索引將被刪除。

5.索引的弊端

首先,索引是以檔案的形式儲存的,索引檔案要佔用磁碟空間。如果有大量的索引,索引檔案可能會比資料檔案更快地達到最大的檔案尺寸。

其次,在更新表中索引列上的資料時,對索引也需要更新,這可能需要重新組織一個索引,如果表中的索引很多,這是很浪費時間的。也就是說,這樣就降低了新增、刪除、修改和其他寫入操作的效率。表中的索引越多,則更新表的時間就越長。

但是這些弊端並不妨礙索引的應用,因為索引帶來的好處已經基本掩蓋了它的缺陷,在表中有很多行資料的時候,索引通常是不可缺少的。