【MySQL】索引

 

目錄

9.1.1  索引的含義和特點

9.1.2  索引的分類

9.1.3  索引的設計原則

9.2  創建索引

9.3  刪除索引


9.1.1  索引的含義和特點

索引是一個單獨的、存儲在磁盤上的數據庫結構,它們包含着對數據表裏所有記錄的引用指針。

索引用於快速找出在某個列中有一特定值的行。不使用索引, MySQL必須從第1條記錄開始讀完整個表,直到找出相關的行。表越大,查詢數據所花費的時間越多。如果表中查詢的列有一個索引, MySQL能快速到達某個位置搜尋數據文件,而不必查看所有數據。

索引根據存儲引擎的不同而有不同的最大索引(16)或索引長度(256);

存儲引擎

支持的索引

MyISAM

BTREE

InnoDB

MEMORY

HASH

HEAP

 

索引的優點。

       索引的優點主要有以下幾條;

(1)通過創建唯一索引,可以保證數據庫表中每一行數據的唯一性。·

(2)可以大大加快數據的查詢速度,這也是創建索引的最主要的原因。

(3)在實現數據的參考完整性方面,可以加速表和表之間的連接。

(4)在使用分組和排序子句進行數據查詢時,也可以顯著減少查詢中分組和排序的時間。

 

索引的缺點。

(1)創建索引和維護索引要耗費時間,並且隨着數據量的增加所耗費的時間也會增加。

(2)索引需要佔磁盤空間,除了數據表佔數據空間之外,每一個索引還要佔一定的物理 ,空間,如果有大量的索引,索引文件可能比數據文件更快達到最大文件尺寸。

(3)當對錶中的數據進行增加、刪除和修改的時候,索引也要動態地維護,這樣就降低了數據的維護速度。

 

9.1.2  索引的分類

a. 普通索引和唯一索引

       普通允許索引的列中重複或者空值;

       唯一中列值唯一,允許空值。若是組合索引,則列值的組合必唯一。主鍵也是特殊唯一索引,但不允許空值;

 

b. 單列索引和組合索引

單列索引即一個索引只包含單個列,一個表可以有多個單列索引。

組合索引指在表的多個字段組合上創建的索引,只有在查詢條件中使用了這些字段的左邊字段時,索引纔會被使用。使用組合索引時遵循最左前綴集合。

c. 全文索引全文索引類型爲FULLTEXT,在定義索引的列上支持值的全文查找,允許在這些索引列中插入重複值和空值。全文索引可以在CHAR, VARCHAR或者TEXT類型的列上創建。MySQL中只有MyISAM存儲引擎支持全文索引。

d. 空間索引空間索引是對空間數據類型的字段建立的索引, MySOL中的空間數據類型有4種,分別是: GEOMETRY(幾何), POINT, LINESTRING(線)和POLYGON(多邊形). MySOL使用SPATIAL(空間)關鍵字進行擴展,使得能夠用於創建正規索引類似的語法創建空間索引。創建空間索引的列,必須將其聲明爲NOT NULL,空間索引只能在存儲引擎爲MyISAM的表中創建。

 

9.1.3  索引的設計原則

索引並非越多越好。

避免對經常更新的表進行過多的索引,並且索引中的列儘可能少。

數據量小的表最好不要使用索引。

在條件表達式中經常用到的不同值較多的列上建立檢索。

當唯一性是某種數據本身的特徵時,指定唯一索引。

在頻繁進行排序或分組(即進行group by或order by操作)的列上建立索引,可組合。

 

9.2  創建索引

SHOW INDEX FROM book \G 查看指定表中創建的索引;

9.2.1  創建表的時候創建索引

創建表時創建索引的基本語法格式如下:

CREATE  TABLE 

     table_name [col_name data_type]
    [UNIQUE|FULLTEXT|SPATIAL] [INDEX|KEY]    

    [index_name] (col_name [length])

    [ASC | DESC]

 

explain select * from book where year_publication=1990 使用EXPLAIN語句查看索引是否正在使用;

UNIQUE INDEX UniqIdx(id) 在id字段上已經建立了一個名爲UniqIdx的唯一索引

INDEX SingleIdx(name(20)) 在name字段上已經建立了一個名爲SingleIdx的單列索引,索引長度爲20,長度越精確越快,體積越小。
INDEX MultiIdx(id, name(10), age) 在 id、name和age字段上建立了一個名爲MultiIdx的組合索引。

組合索引可起幾個索引的作用,但是使用時並不是隨便查詢哪個字段都可以使用索引,而是遵從“最左前綴”:利用索引中最左邊的列集來匹配行,這樣的列集稱爲最左前綴。例如這裏由id、name和age 3個字段構成的索引,索引行中按id/name/age的順序存放,索引可以搜索下面字段組合:(id, name, age)、(id, name)或者id。如果列不構成索引最左面的前綴,MySQL不能使用局部索引,如(age)或者(name,age)組合則不能使用索引查詢。

多列索引是先按照第一列進行排序,然後在第一列排好序的基礎上再對第二列排序,如果沒有第一列的話,直接訪問第二列,那第二列肯定是無序的,直接訪問後面的列就用不到索引了。

請見原文的詳細解答

 

9.2.2  在已經存在的表上創建索引

1.使用ALTER TABLE語句創建索引

ALTER TABLE 表名 ADD [FULLTEXT/SPATIAL] INDEX 索引名(字段(長度));

2.使用CREATE INDEX創建索引

CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name

ON table_name (col_name[length],…升降序) [ASC | DESC]


9.3  刪除索引

1.使用ALTER TABLE刪除索引

ALTER TABLE table_name

       DROP INDEX index_name;

2.使用DROP INDEX語句刪除索引

DROP INDEX index_name ON table_name;

 

 

 

 

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