1. 程式人生 > >資料庫索引,你瞭解嗎?

資料庫索引,你瞭解嗎?

索引是對資料庫表中一列或多列的值進行排序的一種結構,使用索引可快速訪問資料庫表中的特定資訊。

當資料庫記錄少的時候索引的用處可能體現不出來,但是當資料庫中有幾十萬條記錄時,就可以體現索引的好處了,建立索引可以有效的提高資料庫的查詢效率。

例如這樣一個查詢:SELECT *FROM product WHERE ID = 24。如果沒有索引,必須遍歷整個表,直到ID等於24的這一行被找到為止;有了索引之後(必須是在ID這一列上建立的索引),直接在索引裡面找24(也就是在ID這一列找),就可以得知這一行的位置,也就是找到了這一行。可見,索引是用來定位的。 建立索引的目的是加快對錶中記錄的查詢或排序。

但是索引帶來的問題:

1)雖然索引大大提高了查詢速度,同時卻會降低更新表的速度,如對錶進行INSERT、UPDATE和DELETE。因為更新表時,MySQL不僅要儲存資料,還要儲存一下索引檔案。

2)建立索引會佔用磁碟空間的索引檔案。一般情況這個問題不太嚴重,但如果你在一個大表上建立了多種組合索引,索引檔案的會膨脹很快。

建立索引的語句
alter table product add index index-name(‘id’)

SQL中的索引分為兩種,一種為聚集索引和非聚集索引,下面介紹兩者的異同。

一、聚集索引與非聚集索引:
1、聚集索引:
聚集索引的意思可以理解為順序排列,比如一個主鍵自增的表即為聚集索引,即id為1的存在於第一條,id為2的存在於第二條…假使資料庫中是使用陣列來存放的這張表中的資料,那麼如果我需要查詢第100條,那麼直接第一條資料的地址加上100即為第一百條的地址,一次就能查詢出來。
因為資料庫中的資料只能按照一個順序進行排列,所以聚集索引一個數據庫只能有一個。在mysql中,不能自己建立聚集索引,主鍵即為聚集索引,如果沒有建立主鍵,那麼預設非空的列為聚集索引,如果沒有非空的列那麼會自動生成一個隱藏列為聚集索引。
所以一般在mysql中,我們建立的主鍵即為聚集索引,資料是按照我們的主鍵順序進行排列。所以在根據主鍵進行查詢時會非常快。

2、非聚集索引:
非聚集索引可以簡單理解為有序目錄,是一種以空間換取時間的方法。舉個例子,在一個user表中,有一個id_num,即身份號,此不為主鍵id,那麼這些資料在儲存的時候都是無序的,比如
id為1的id_num為100,id為2的id_num為97,id為3的id_num為98,id為4的id_num為99,id為5的id_num為96。。。id為67的id_num為56。。。
那麼如果我要查詢id_num為56的人,那麼只能一條一條的遍歷,n條就需要查詢n次,時間複雜度為O(n),這是非常耗費效能的。

所以,現在就需要為id_num增加非聚集索引,添加了非聚集索引後,會給id_num進行排序(內部使用結構為B+樹),並且排序後,我只需要查詢此目錄(即查詢B+樹),很快就知道為id為56的在資料庫中的第67條,而不需要在去遍歷表中的所有資料。
所以,在非聚集索引中,不重複的資料越多,那麼索引的效率越高。