這篇文章給大家聊聊關于數據庫索引的作用,以及索引是什么意思舉個例子對應的知識點,希望對各位有所幫助,不要忘了收藏本站哦。
數據庫中建立索引的目的是為了誰
在數據庫物理設計階段,為數據表創建索引的目的是:提高查詢的檢索能力、提高查詢效率。索引是對數據表中一個或多個列的值進行排序的一種結構,建立索引可以極大地提高在數據庫中獲取所需信息的速度,同時還能提高服務器處理相關搜索請求的效率。
數據庫為什么要建索引
在滿足語句需求的情況下,盡量少的訪問資源是數據庫設計的重要原則,這和執行的SQL有直接的關系,索引問題又是SQL問題中出現頻率最高的,常見的索引問題包括:無索引(失效)、隱式轉換。1.SQL執行流程看一個問題,在下面這個表T中,如果我要執行需要執行幾次樹的搜索操作,會掃描多少行?
這分別是ID字段索引樹、k字段索引樹。
這條SQL語句的執行流程:
1.在k索引樹上找到k=3,獲得ID=3002.回表到ID索引樹查找ID=300的記錄,對應R33.在k索引樹找到下一個值k=5,ID=5004.再回到ID索引樹找到對應ID=500的R4
5.在k索引樹去下一個值k=6,不符合條件,循環結束
這個過程讀取了k索引樹的三條記錄,回表了兩次。因為查詢結果所需要的數據只在主鍵索引上有,所以必須得回表。所以,我們該如何通過優化索引,來避免回表呢?2.常見索引優化2.1覆蓋索引覆蓋索引,換言之就是索引要覆蓋我們的查詢請求,無需回表。
如果執行的語句是,這樣的話因為ID的值在k索引樹上,就不需要回表了。
覆蓋索引可以減少樹的搜索次數,顯著提升查詢性能,是常用的性能優化手段。
但是,維護索引是有代價的,所以在建立冗余索引來支持覆蓋索引時要權衡利弊。
2.2最左前綴原則
B+樹的數據項是復合的數據結構,比如的時候,B+樹是按照從左到右的順序來建立搜索樹的,當這樣的數據來檢索的時候,B+樹會優先比較name來確定下一步的檢索方向,如果name相同再依次比較sex和age,最后得到檢索的數據。
可以清楚的看到,A1使用tl索引,A2進行了全表掃描,雖然A2的兩個條件都在tl索引中出現,但是沒有使用到name列,不符合最左前綴原則,無法使用索引。所以在建立聯合索引的時候,如何安排索引內的字段排序是關鍵。評估標準是索引的復用能力,因為支持最左前綴,所以當建立(a,b)這個聯合索引之后,就不需要給a單獨建立索引。原則上,如果通過調整順序,可以少維護一個索引,那么這個順序往往就是需要優先考慮采用的。上面這個例子中,如果查詢條件里只有b,就是沒法利用(a,b)這個聯合索引的,這時候就不得不維護另一個索引,也就是說要同時維護(a,b)、(b)兩個索引。這樣的話,就需要考慮空間占用了,比如,name和age的聯合索引,name字段比age字段占用空間大,所以創建(name,age)聯合索引和(age)索引占用空間是要小于(age,name)、(name)索引的。
2.3索引下推
以人員表的聯合索引(name,age)為例。如果現在有一個需求:檢索出表中“名字第一個字是張,而且年齡是26歲的所有男性”。那么,SQL語句是這么寫的
通過最左前綴索引規則,會找到ID1,然后需要判斷其他條件是否滿足在MySQL5.6之前,只能從ID1開始一個個回表。到主鍵索引上找出數據行,再對比字段值。而MySQL5.6引入的索引下推優化(indexconditionpushdown),可以在索引遍歷過程中,對索引中包含的字段先做判斷,直接過濾掉不滿足條件的記錄,減少回表次數。這樣,減少了回表次數和之后再次過濾的工作量,明顯提高檢索速度。
2.4隱式類型轉化
隱式類型轉化主要原因是,表結構中指定的數據類型與傳入的數據類型不同,導致索引無法使用。所以有兩種方案:
修改表結構,修改字段數據類型。
修改應用,將應用中傳入的字符類型改為與表結構相同類型。
3.為什么會選錯索引3.1優化器選擇索引是優化器的工作,其目的是找到一個最優的執行方案,用最小的代價去執行語句。在數據庫中,掃描行數是影響執行代價的因素之一。掃描的行數越少,意味著訪問磁盤數據的次數越少,消耗的CPU資源越少。當然,掃描行數并不是唯一的判斷標準,優化器還會結合是否使用臨時表、是否排序等因素進行綜合判斷。
3.2掃描行數
MySQL在真正開始執行語句之前,并不能精確的知道滿足這個條件的記錄有多少條,只能通過索引的區分度來判斷。顯然,一個索引上不同的值越多,索引的區分度就越好,而一個索引上不同值的個數我們稱為“基數”,也就是說,這個基數越大,索引的區分度越好。
MySQL使用采樣統計方法來估算基數:采樣統計的時候,InnoDB默認會選擇N個數據頁,統計這些頁面上的不同值,得到一個平均值,然后乘以這個索引的頁面數,就得到了這個索引的基數。而數據表是會持續更新的,索引統計信息也不會固定不變。所以,當變更的數據行數超過1/M的時候,會自動觸發重新做一次索引統計。
在MySQL中,有兩種存儲索引統計的方式,可以通過設置參數innodb_stats_persistent的值來選擇:
on表示統計信息會持久化存儲。默認N=20,M=10。
off表示統計信息只存儲在內存中。默認N=8,M=16。
由于是采樣統計,所以不管N是20還是8,這個基數都很容易不準確。所以,冤有頭債有主,MySQL選錯索引,還得歸咎到沒能準確地判斷出掃描行數。
可以用來重新統計索引信息,進行修正。
3.3索引選擇異常和處理1.采用forceindex強行選擇一個索引。2.可以考慮修改語句,引導MySQL使用我們期望的索引。3.有些場景下,可以新建一個更合適的索引,來提供給優化器做選擇,或刪掉誤用的索引。
覆蓋索引是什么
覆蓋索引是一種特殊類型的數據庫索引,它包含了查詢所需的所有字段數據,而無需再對數據表進行進一步的訪問。它可以避免了在主索引或輔助索引中查找相應數據行的過程,提高了查詢的效率。具體原因有以下幾點:1.當使用覆蓋索引時,數據庫不需要額外的I/O操作,因為它可以直接從索引中讀取所需的字段數據,節省了磁盤和內存的讀取時間,加快了查詢的速度。2.覆蓋索引減少了數據庫系統的資源開銷,尤其在大數據量的情況下,通過避免隨機I/O操作,減少了磁盤尋址時間,優化了查詢性能。3.由于避免了對表數據的再次訪問,覆蓋索引減少了鎖定和并發控制的需要,提高了并發查詢的效率。所以,覆蓋索引在優化查詢性能方面具有重要的作用。
電腦索引是什么開了會卡嗎
索引:在關系數據庫中,索引是一種單獨的、物理的對數據庫表中一列或多列的值進行排序的一種存儲結構,它是某個表中一列或若干列值的集合和相應的指向表中物理標識這些值的數據頁的邏輯指針清單。
作用:相當于圖書的目錄,可以根據目錄中的頁碼快速找到所需的內容。索引其實是提高搜索速度的。
如果覺得卡,想要刪除的話,按步驟打開控制面板→索引選項→更改windows的搜索方式→修改,把所有的鉤都去掉,這樣就關閉索引了。
access中索引有什么用
在access關系數據庫中,索引是關系數據庫中的一種單獨的、物理的對數據庫表中一列或多列的值進行排序的一種存儲結構,它是某個表中一列或若干列值的集合和相應的指向表中物理標識,這些值的數據頁的邏輯指針清單。
索引的作用相當于圖書的目錄,可以根據目錄中的頁碼快速找到所需的內容。
索引提供指向存儲在表的指定列中的數據值的指針,然后根據您指定的排序順序對這些指針排序。數據庫使用索引以找到特定值,然后順指針找到包含該值的行。這樣可以使對應于表的SQL語句執行得更快,可快速訪問數據庫表中的特定信息。
access2010索引作用
在access關系數據庫中,索引是關系數據庫中的一種單獨的、物理的對數據庫表中一列或多列的值進行排序的一種存儲結構,它是某個表中一列或若干列值的集合和相應的指向表中物理標識,這些值的數據頁的邏輯指針清單。
索引的作用相當于圖書的目錄,可以根據目錄中的頁碼快速找到所需的內容。
索引提供指向存儲在表的指定列中的數據值的指針,然后根據您指定的排序順序對這些指針排序。數據庫使用索引以找到特定值,然后順指針找到包含該值的行。這樣可以使對應于表的SQL語句執行得更快,可快速訪問數據庫表中的特定信息。
文章分享結束,數據庫索引的作用和索引是什么意思舉個例子的答案你都知道了嗎?歡迎再次光臨本站哦!