關於sql索引的分享

一、什麼是索引? 索引是一種存儲引擎用於快速查找記錄的數據結構html


二、索引的類型和方法 根據數據庫的功能,能夠在數據庫設計器中建立四種索引:非彙集索引(惟一索引、非惟一索引、主鍵索引)和彙集索引。 儘管惟一索引有助於定位信息,但爲得到最佳性能結果,建議改用主鍵或惟一約束。 (1)惟一索引 :惟一索引是不容許其中任何兩行具備相同索引值的索引 (2)非惟一索引 : 非惟一索引是相對惟一索引,容許其中任何兩行具備相同索引值的索引 (3)主鍵索引 : 數據庫表常常有一列或列組合,其值惟一標識表中的每一行 思考:主鍵和惟一索引有什麼區別? (4)彙集索引 : 在彙集索引中,表中行的物理順序與鍵值的邏輯(索引)順序相同。一個表只能包含一個彙集索引。 思考:非彙集索引和彙集索引有什麼區別?mysql

彙集索引:表數據是按照索引的順序來存儲的,也就是說,索引項的順序與表中記錄的物理順序一致。對於彙集索引,葉子結點即存儲了真實的數據行,再也不有另外單獨的數據頁。正由於索引的數據需與數據物理存儲的順序一致,在一張表上最多隻能建立一個彙集索引。  非彙集索引:表數據存儲順序與索引順序無關。對於非彙集索引,葉結點包含索引字段值及指向數據頁、數據行的邏輯指針。算法

對非彙集索引和彙集索引的總結與心得: 彙集索引對於那些常常要搜索範圍值的列特別有效。使用匯集索引找到包含第一個值的行後,即可以確保包含後續索引值的行在物理相鄰。例如,若是應用程序執行 的一個查詢常常檢索某一日期範圍內的記錄,則使用匯集索引能夠迅速找到包含開始日期的行,而後檢索表中全部相鄰的行,直到到達結束日期。這樣有助於提升此 類查詢的性能。一樣,若是對從表中檢索的數據進行排序時常常要用到某一列,則能夠將該表在該列上彙集(物理排序),避免每次查詢該列時都進行排序,從而節 省成本。有一點需注意的,是使用匯集索引的查詢效率雖然要比非彙集索引的效率要高,可是若是須要頻繁去改變彙集索引的值,寫入性能並不高,由於須要移動對應數據的物理位置。sql

此處,順便引入索引的兩類方法:B+樹索引和哈希索引;先了解下兩者的基本概念:B+樹是一個平衡的多叉樹,從根節點到每一個葉子節點的高度差值不超過1,並且同層級的節點間有指針相互連接。哈希索引就是採用必定的哈希算法,把鍵值換算成新的哈希值,檢索時不須要相似B+樹那樣從根節點到葉子節點逐級查找,只需一次哈希算法便可馬上定位到相應的位置,速度很是快。 因而可知,在時間複雜度方面,哈希方法的索引明顯是佔優,僅爲O(1),那從實際sql查詢的運用上,在等值查詢的時候就可使用哈希方法的索引;可是若是涉及到範圍查詢和有大量重複鍵存在的狀況,則應選擇B+數方法的索引 對哈希索引和B+樹索引的總結與心得: 一般,B+樹索引結構適用於絕大多數場景(包括範圍查詢、排序、分組等查詢特徵),而在存儲的數據重複度很低(也就是說基數很大),對該列數據以等值查詢爲主,沒有範圍查詢、沒有排序的時候,就特別適合採用哈希索引。數據庫


三、索引有什麼用呢?其有什麼優缺點? 優勢: (1)、加快數據的檢索速度 (2)、建立惟一性索引,能保證表中每一行數據的惟一性 (3)、......歡迎補充性能優化

缺點: (1)、建立索引和維護索引須要時間,並且數據量越大時間越長 (2)、建立索引須要佔據磁盤的空間,若是有大量的索引,可能比數據文件更快達到最大文件尺寸 (3)、當對錶中的數據進行增長,修改,刪除的時候,索引也要同時進行維護,下降了數據的維護速度數據結構

對創建索引的設計原則: 1.不是越多越好 2.常更新的表越少越好 3.數據量小的表最好不要創建索引 4.不一樣的值比較多的列才須要創建索引 5.某種數據自己具有惟一性的時候,創建惟一性索引,能夠保證定義的列的數據完整性,以提升查詢熟度 6.頻繁進行排序或分組的列(group by或者是order by)能夠創建索引,提升搜索速度 7.常常用於查詢條件的字段應該創建索引數據庫設計


四、索引性能優化 思考:索引居然能提升查詢速度,那索引是否是越多越好?,答案固然是否是的,因此咱們須要對索引的性能進行分析,進而選擇最合理的索引設計方案。 (1)、sql性能查詢:開發中咱們使用explain能夠幫助選擇更好的索引和寫出更優化的查詢語句 (2) 、sql執行的效率爲(const>eq_ref>ref>range>index>all),具體能夠參考連接: http://www.javashuo.com/article/p-djdeatzx-cc.html性能

(3)實際項目中遇到的問題: A、數據量大但沒有創建索引 B、有索引但結果集過大致使不走索引 C、使用組合索引的時候,有字段沒有命中 D、使用連表查詢優化

(4)對上面問題的總結: 對組合索引的字段觀察是否都命中; 雖然索引大大提升了查詢速度,同時卻會下降更新表的速度; MySQL查詢只使用一個索引,所以若是where子句中已經使用了索引的話,那麼 order by中的列是不會使用索引的;幾個單獨索引的效率<組合索引; 當結果集超過數據的25%時,不走索引; 單獨的sql語句中包含 >,<,in等,走不走索引也是有結果集有關; 字段的大小也會影響索引的的查詢速度; 若是組合索引中有一列含有null值,這一列讀組合索引無效;


五、針對索引失效的問題,在下面統一概括(歡迎補充) 一、若是條件中有or,即便其中有條件帶索引也不會使用 二、當結果集超過數據的25%時,不走索引 三、若是組合索引中有一列含有null值,這一列讀組合索引無效 四、單獨引用複合索引裏非第一位置的索引列 五、對小表查詢,mysql認爲不用索引更快 六、用like模糊查詢以 % 開頭 七、單獨的sql語句中包含 >,<,in等涉及到範圍查詢,走不走索引也是有結果集有關;

.............................後續歡迎進行補充


六、索引的概括總結: 在數據庫設計時,咱們就應該要充分考慮到索引對後續應用的影響,對索引進行性能分析和針對性的設計。


百度知道:主鍵和惟一索引的區別; 主鍵是一種約束,惟一索引是一種索引,二者在本質上是不一樣的。 主鍵建立後必定包含一個惟一性索引,惟一性索引並不必定就是主鍵。 惟一性索引列容許空值,而主鍵列不容許爲空值。 主鍵列在建立時,已經默認爲空值 + 惟一索引了。 主鍵能夠被其餘表引用爲外鍵,而惟一索引不能。 一個表最多隻能建立一個主鍵,但能夠建立多個惟一索引。 主鍵更適合那些不容易更改的惟一標識,如自動遞增列、身份證號等。 在 RBO 模式下,主鍵的執行計劃優先級要高於惟一索引。 二者能夠提升查詢的速度。 explain中type幾種類型; type:鏈接類型  最關鍵的一列  效率(const>eq_ref>ref>range>index>all) 一、const:查詢索引字段,而且表中最多隻有一行匹配(好像只有主鍵查詢只匹配一行纔會是const,有些狀況惟一索引匹配一行會是ref) 二、eq_ref    主鍵或者惟一索引   三、ref   非惟一索引(主鍵也是惟一索引) 四、range  索引的範圍查詢 五、index  (type=index extra = using index 表明索引覆蓋,即不須要回表) 六、all 全表掃描(一般沒有建索引的列)

相關文章
相關標籤/搜索