摘要:現在我們不加索引查詢年齡為歲的人數。相反,由于增加了索引,反而降低了系統的維護速度和增大了空間需求。增加索引,并不能明顯加快檢索速度。當減少索引時,會提高修改性能,降低檢索性能。
什么是數據庫索引?
索引是對數據庫表中一列或多列的值進行排序的一種結構,使用索引可快速訪問數據庫表中的特定信息。如果想按特定職員的姓來查找他或她,則與在表中搜索所有的行相比,索引有助于更快地獲取信息。
簡單來說,索引就是一種排序的數據結構,數據庫中的數據無序,但是這種結構是有序的,這種有序的結構指向數據庫中的數據,使得數據在邏輯上是有序的(但是實際的存儲仍然是無序的)。
利用這種邏輯上的有序性,可以更快的進行查詢,否則必須進行全表掃描。
全表掃描的時間復雜度是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**
現在我們刪除索引再添加數據:
刪除索引:ALTER TABLE user DROP INDEX myIndex
插入數據:
insert into user(name,age,position) VALUES("未命名",20,"老師")
受影響的行: 1
時間: 0.016s
可以發現有索引的時候插入數據的耗時非常大,并且這是只有兩個索引的時候(主鍵索引和剛才添加的age列的索引)如果索引較多,那么耗時則會更大!!!
最后,索引實際上是為了查詢優化而誕生的技術,它可以大大減少查詢的時間,但是也會大大增加增刪改的時間,因此并不是建立索引就一定能使得系統性能得到提升,因為系統的時間不僅取決于查詢的時間,也取決于增刪改的時間。
一般來說,不應該創建索引的這些列具有下列特點:
第一,對于那些在查詢中很少使用或者參考的列不應該創建索引。這是因為,既然這些列很少使用到,因此有索引或者無索引,并不能提高查詢速度。相反,由于增加了索引,反而降低了系統的維護速度和增大了空間需求。
第二,對于那些只有很少數據值的列也不應該增加索引。這是因為,由于這些列的取值很少,例如人事表的性別列,在查詢的結果中,結果集的數據行占了表中數據行的很大比例,即需要在表中搜索的數據行的比例很大。增加索引,并不能明顯加快檢索速度。
第三,對于那些定義為text, image和bit數據類型的列不應該增加索引。這是因為,這些列的數據量要么相當大,要么取值很少,不利于使用索引。
第四,當修改性能遠遠大于檢索性能時,不應該創建索引。這是因為,修改性能和檢索性能是互相矛盾的。當增加索引時,會提高檢索性能,但是會降低修改性能。當減少索引時,會提高修改性能,降低檢索性能。因此,當修改操作遠遠多于檢索操作時,不應該創建索引。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/73278.html
摘要:索引實驗實驗目的了解索引對于全列匹配,最左前綴匹配范圍查詢的影響。因此在中要謹慎地區分多值匹配和范圍匹配,否則會對的行為產生困惑。事務隔離層級實驗實驗目的了解中事務隔離級別以及什么是臟讀,幻讀,不可重復讀。 索引實驗 實驗目的:了解索引對于全列匹配,最左前綴匹配、范圍查詢的影響。實驗所用數據庫見文章最底部連接。 實驗軟件版本:5.7.19-0ubuntu0.16.04.1-log (U...
摘要:希望索引值之間用隔開,而最后的索引值后面無。優化代碼這個判斷用于防止最后一個索引值后面還有結果查看其實用來跳出循環一直覺得不太規范。。。小實驗是顯示次數其實就是那個索引值啦,這次顯示的是字符哦涉及到字符,就要用到方法。 第一篇技術文章寫些簡單點的~在大三上web前端開發課程時,雖然能用JavaScript制作一些簡單的頁面動態效果,但其實很多JS知識并未掌握,所以自己又通過視頻再復習一...
閱讀 1048·2021-11-22 15:33
閱讀 3357·2021-11-08 13:20
閱讀 1368·2021-09-22 10:55
閱讀 2053·2019-08-29 11:08
閱讀 771·2019-08-26 12:24
閱讀 3068·2019-08-23 17:15
閱讀 2225·2019-08-23 16:12
閱讀 1933·2019-08-23 16:09