mysqll索引實驗

什麼是數據庫索引?
索引是對數據庫表中一列或多列的值進行排序的一種結構,使用索引可快速訪問數據庫表中的特定信息。若是想按特定職員的姓來查找他或她,則與在表中搜索全部的行相比,索引有助於更快地獲取信息。
簡單來講,索引就是一種排序的數據結構,數據庫中的數據無序,可是這種結構是有序的,這種有序的結構指向數據庫中的數據,使得數據在邏輯上是有序的(可是實際的存儲仍然是無序的)。
利用這種邏輯上的有序性,能夠更快的進行查詢,不然必須進行全表掃描
全表掃描的時間複雜度是O(n),這是一個看起來還不錯的複雜度。然而數據庫中的數據每每是存儲在外存儲器上的,而且這些數據也沒法一次性所有調入內存,那麼若是全表掃描必然出現屢次的訪問外存操做,這是一個極度耗時的操做,把這些數據調入內存所花費的時間甚至比在內存中掃描這些數據花費的時間多得多。這使得O(n)複雜度的時間規模在這裏已經不適用了!!!
利用索引這種有序結構不只能夠減小比較次數(再也不是全表掃描),並且還能夠減小訪問外存的次數,這樣一來,時間大大縮短數據庫

下面來作試驗。
如今有一張信息表user,表結構爲:
name,id,age,position數據結構

其中name表明用戶名字,id表明用戶帳戶,age表明用戶年齡,position表明用戶職位。
這張表有100000條數據。
如今咱們不加索引查詢年齡爲30歲的人數。
結果:性能

select count(*) from user where age = 32
受影響的行: 0
時間: 0.015s優化

而後添加索引:
CREATE INDEX myIndex ON user(age)
再查詢一次:排序

select count(*) from user where age = 32
受影響的行: 0
時間: 0.001s索引

發現時間爲原來的1/15!!!
這大大加快了查詢的速度!!!內存

不過索引也並不是全是優勢。
爲了維護索引的有序性,在添加或者刪除數據的時候會形成很大的時間損耗。
好比咱們如今插入一條數據
**insert into user(name,age,position) VALUES('未命名',29,'老師')
受影響的行: 1
時間: 0.094s**get

如今咱們刪除索引再添加數據:
刪除索引:ALTER TABLE user DROP INDEX myIndex
插入數據:
insert into user(name,age,position) VALUES('未命名',20,'老師')
受影響的行: 1
時間: 0.016sit

能夠發現有索引的時候插入數據的耗時很是大,而且這是隻有兩個索引的時候(主鍵索引和剛纔添加的age列的索引)若是索引較多,那麼耗時則會更大!!!io

最後,索引其實是爲了查詢優化而誕生的技術,它能夠大大減小查詢的時間,可是也會大大增長增刪改的時間,所以並非創建索引就必定能使得系統性能獲得提高,由於系統的時間不只取決於查詢的時間,也取決於增刪改的時間。通常來講,不該該建立索引的這些列具備下列特色:第一,對於那些在查詢中不多使用或者參考的列不該該建立索引。這是由於,既然這些列不多使用到,所以有索引或者無索引,並不能提升查詢速度。相反,因爲增長了索引,反而下降了系統的維護速度和增大了空間需求。第二,對於那些只有不多數據值的列也不該該增長索引。這是由於,因爲這些列的取值不多,例如人事表的性別列,在查詢的結果中,結果集的數據行佔了表中數據行的很大比例,即須要在表中搜索的數據行的比例很大。增長索引,並不能明顯加快檢索速度。第三,對於那些定義爲text, image和bit數據類型的列不該該增長索引。這是由於,這些列的數據量要麼至關大,要麼取值不多,不利於使用索引。第四,當修改性能遠遠大於檢索性能時,不該該建立索引。這是由於,修改性能和檢索性能是互相矛盾的。當增長索引時,會提升檢索性能,可是會下降修改性能。當減小索引時,會提升修改性能,下降檢索性能。所以,當修改操做遠遠多於檢索操做時,不該該建立索引。

相關文章
相關標籤/搜索