摘要:現(xiàn)在我們不加索引查詢年齡為歲的人數(shù)。相反,由于增加了索引,反而降低了系統(tǒng)的維護速度和增大了空間需求。增加索引,并不能明顯加快檢索速度。當(dāng)減少索引時,會提高修改性能,降低檢索性能。
什么是數(shù)據(jù)庫索引?
索引是對數(shù)據(jù)庫表中一列或多列的值進行排序的一種結(jié)構(gòu),使用索引可快速訪問數(shù)據(jù)庫表中的特定信息。如果想按特定職員的姓來查找他或她,則與在表中搜索所有的行相比,索引有助于更快地獲取信息。
簡單來說,索引就是一種排序的數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)庫中的數(shù)據(jù)無序,但是這種結(jié)構(gòu)是有序的,這種有序的結(jié)構(gòu)指向數(shù)據(jù)庫中的數(shù)據(jù),使得數(shù)據(jù)在邏輯上是有序的(但是實際的存儲仍然是無序的)。
利用這種邏輯上的有序性,可以更快的進行查詢,否則必須進行全表掃描。
全表掃描的時間復(fù)雜度是O(n),這是一個看起來還不錯的復(fù)雜度。然而數(shù)據(jù)庫中的數(shù)據(jù)往往是存儲在外存儲器上的,并且這些數(shù)據(jù)也無法一次性全部調(diào)入內(nèi)存,那么如果全表掃描必然出現(xiàn)多次的訪問外存操作,這是一個極度耗時的操作,把這些數(shù)據(jù)調(diào)入內(nèi)存所花費的時間甚至比在內(nèi)存中掃描這些數(shù)據(jù)花費的時間多得多。這使得O(n)復(fù)雜度的時間規(guī)模在這里已經(jīng)不適用了?。?!
利用索引這種有序結(jié)構(gòu)不僅可以減少比較次數(shù)(不再是全表掃描),而且還可以減少訪問外存的次數(shù),這樣一來,時間大大縮短。
下面來做試驗。
現(xiàn)在有一張信息表user,表結(jié)構(gòu)為:
name,id,age,position
其中name代表用戶名字,id代表用戶賬戶,age代表用戶年齡,position代表用戶職位。
這張表有100000條數(shù)據(jù)。
現(xiàn)在我們不加索引查詢年齡為30歲的人數(shù)。
結(jié)果:
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
發(fā)現(xiàn)時間為原來的1/15?。。?br>這大大加快了查詢的速度?。?!
不過索引也并非全是優(yōu)點。
為了維護索引的有序性,在添加或者刪除數(shù)據(jù)的時候會造成很大的時間損耗。
比如我們現(xiàn)在插入一條數(shù)據(jù)
**insert into user(name,age,position) VALUES("未命名",29,"老師")
受影響的行: 1
時間: 0.094s**
現(xiàn)在我們刪除索引再添加數(shù)據(jù):
刪除索引:ALTER TABLE user DROP INDEX myIndex
插入數(shù)據(jù):
insert into user(name,age,position) VALUES("未命名",20,"老師")
受影響的行: 1
時間: 0.016s
可以發(fā)現(xiàn)有索引的時候插入數(shù)據(jù)的耗時非常大,并且這是只有兩個索引的時候(主鍵索引和剛才添加的age列的索引)如果索引較多,那么耗時則會更大?。?!
最后,索引實際上是為了查詢優(yōu)化而誕生的技術(shù),它可以大大減少查詢的時間,但是也會大大增加增刪改的時間,因此并不是建立索引就一定能使得系統(tǒng)性能得到提升,因為系統(tǒng)的時間不僅取決于查詢的時間,也取決于增刪改的時間。
一般來說,不應(yīng)該創(chuàng)建索引的這些列具有下列特點:
第一,對于那些在查詢中很少使用或者參考的列不應(yīng)該創(chuàng)建索引。這是因為,既然這些列很少使用到,因此有索引或者無索引,并不能提高查詢速度。相反,由于增加了索引,反而降低了系統(tǒng)的維護速度和增大了空間需求。
第二,對于那些只有很少數(shù)據(jù)值的列也不應(yīng)該增加索引。這是因為,由于這些列的取值很少,例如人事表的性別列,在查詢的結(jié)果中,結(jié)果集的數(shù)據(jù)行占了表中數(shù)據(jù)行的很大比例,即需要在表中搜索的數(shù)據(jù)行的比例很大。增加索引,并不能明顯加快檢索速度。
第三,對于那些定義為text, image和bit數(shù)據(jù)類型的列不應(yīng)該增加索引。這是因為,這些列的數(shù)據(jù)量要么相當(dāng)大,要么取值很少,不利于使用索引。
第四,當(dāng)修改性能遠遠大于檢索性能時,不應(yīng)該創(chuàng)建索引。這是因為,修改性能和檢索性能是互相矛盾的。當(dāng)增加索引時,會提高檢索性能,但是會降低修改性能。當(dāng)減少索引時,會提高修改性能,降低檢索性能。因此,當(dāng)修改操作遠遠多于檢索操作時,不應(yīng)該創(chuàng)建索引。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/73278.html
摘要:索引實驗實驗?zāi)康牧私馑饕龑τ谌衅ヅ?,最左前綴匹配范圍查詢的影響。因此在中要謹(jǐn)慎地區(qū)分多值匹配和范圍匹配,否則會對的行為產(chǎn)生困惑。事務(wù)隔離層級實驗實驗?zāi)康牧私庵惺聞?wù)隔離級別以及什么是臟讀,幻讀,不可重復(fù)讀。 索引實驗 實驗?zāi)康模毫私馑饕龑τ谌衅ヅ?,最左前綴匹配、范圍查詢的影響。實驗所用數(shù)據(jù)庫見文章最底部連接。 實驗軟件版本:5.7.19-0ubuntu0.16.04.1-log (U...
摘要:希望索引值之間用隔開,而最后的索引值后面無。優(yōu)化代碼這個判斷用于防止最后一個索引值后面還有結(jié)果查看其實用來跳出循環(huán)一直覺得不太規(guī)范。。。小實驗是顯示次數(shù)其實就是那個索引值啦,這次顯示的是字符哦涉及到字符,就要用到方法。 第一篇技術(shù)文章寫些簡單點的~在大三上web前端開發(fā)課程時,雖然能用JavaScript制作一些簡單的頁面動態(tài)效果,但其實很多JS知識并未掌握,所以自己又通過視頻再復(fù)習(xí)一...
閱讀 1066·2021-11-22 15:33
閱讀 3375·2021-11-08 13:20
閱讀 1391·2021-09-22 10:55
閱讀 2060·2019-08-29 11:08
閱讀 783·2019-08-26 12:24
閱讀 3079·2019-08-23 17:15
閱讀 2242·2019-08-23 16:12
閱讀 1946·2019-08-23 16:09