数据库索引的作用以及索引基本原理
當我們面對大量的數據查詢時,為了提高查詢效率,我們在數據庫中總要使用到索引。那么索引究竟是怎么樣的東西呢?
索引本質
索引其實就是一種數據結構,他將數據庫中的數據以一定的數據結構算法進行存儲,能夠幫助我們快速的檢索數據庫中的數據。
何時使用索引
1.當某些列的查詢概率比較高或經常作為where條件的列。
2.在作為主鍵的列上。
3.在經常用在表連接的列上。
在這些時候,我們就要考慮使用此列作為一個索引
索引類型
1.在Mysql數據庫的索引中,主要包括Hash索引和B+ Tree索引,我們常用的InnoDB引擎,默認的是B+樹。
2.Hash索引和B+ Tree索引的區別:
? ? 1)Hash索引底層是哈希表,哈希表是一種以key-value存儲數據的結構,所以多個數據在存儲關系上是完全沒有任何順序關系的,所以,對于區間查詢(大于、小于的范圍查詢)是無法直接通過索引查詢的,就需要全表掃描。所以,哈希索引只適用于等值查詢的場景。而B+ Tree是一種多路平衡查詢樹,所以他的節點是天然有序的(左子節點小于父節點、父節點小于右子節點),所以對于范圍查詢的時候不需要做全表掃描。
? ? 2)哈希索引沒辦法利用索引完成排序(例如order by);
? ? 3)哈希索引不支持多列聯合索引的最左匹配規則。(多列索引(聯合索引)有最左前綴的原則:即最左優先。
如果我們建立了一個2列的聯合索引(col1,col2),實際上已經建立了兩個聯合索引(col1)、(col1,col2);
如果有一個3列索引(col1,col2,col3),實際上已經建立了三個聯合索引(col1)、(col1,col2)、(col1,col2,col3),查詢時,會先查最左的第一個索引col1。)
? ? 4)如果有大量重復鍵值得情況下,哈希索引的效率會很低,因為存在哈希碰撞問題。
3.在B+ Tree索引下還分為了聚簇索引和非聚簇索引。在 InnoDB 里,索引B+ Tree的葉子節點存儲了整行數據的是主鍵索引,也被稱之為聚簇索引。而索引B+ Tree的葉子節點存儲了主鍵的值的是非主鍵索引,也被稱之為非聚簇索引。聚簇索引查詢會更快,因為主鍵索引樹的葉子節點直接就是我們要查詢的整行數據了。而非主鍵索引的葉子節點是主鍵的值,查到主鍵的值以后,還需要再通過主鍵的值再回表進行一次查詢。
4.深入探索問題——什么情況下會發生明明創建了索引,但是執行的時候并沒有通過索引呢?
答:當查詢優化器未選擇到該索引的執行計劃。(查詢優化器:?一條SQL語句的查詢,可以有不同的執行方案,至于最終選擇哪種方案,需要通過優化器進行選擇,選擇執行成本最低的方案。 在一條單表查詢語句真正執行之前,MySQL的查詢優化器會找出執行該語句所有可能使用的方案,對比之后找出成本最低的方案。這個成本最低的方案就是所謂的執行計劃。 優化過程大致如下: 1、根據搜索條件,找出所有可能使用的索引 2、計算全表掃描的代價 3、計算使用不同索引執行查詢的代價 4、對比各種執行方案的代價,找出成本最低的那一個)
索引的缺點
1.創建索引和維護索引要耗費時間,這種時間隨著數據量的增加而增加。
2.索引需要占物理空間,除了數據表占數據空間之外,每一個索引還要占一定的物理空間,如果要建立聚簇索引,那么需要的空間就會更大。
3.當對表中的數據進行增加、刪除和修改的時候,索引也要動態的維護,這樣就降低了數據的維護速度。
索引是否生效
1.在數據庫新建一個查詢,使用?explain 關鍵字進行查詢。
例如?explain select * from user?WHERE company_id=410?
此時在查詢結果中就會發現
possible_keys列下面的值就是你創建的索引名稱,如果為空,則說明你的索引未被使用到。
總結
以上是生活随笔為你收集整理的数据库索引的作用以及索引基本原理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SAP ABAP SD常用数据库表
- 下一篇: 创建数据库索引的几种方法