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