Mysql研磨之設計索引原則

2022-11-24 20:56:12 字數 2044 閱讀 4764

2、使用唯一索引:考慮列中值的分佈。索引的列基礎越大,索引的效果越好。列如記錄性別的列,不管搜尋那個性別,都會得出大約一般的行,因此對此列索引沒有太大的作用

3、使用短索引:如果對字串列進行索引,應該制定一個字首長度,只要有可能就儘量這樣做。例如,有一個char(200)列,如果在前10個或者20個字元進行索引能夠節省大量索引空間,也可能會使查詢更快。較小的索引涉及的磁碟io較小,較短的值比較起來更快。更重要的是,對於較短的鍵值,索引快取記憶體中能夠容納更多的鍵值,因此mysql也可以在記憶體中容納更多的值。這樣就增加了找到索引行而不用讀取索引中較多塊的可能性。

4、利用最左字首。建立一個n列的索引時,實際是建立了mysql可利用的n個索引。多列索引可起幾個索引的作用,因為可以利用索引中最左邊的列集來匹配行。這樣的列整合為最左字首

5、不要過度索引。不要以為索引"越多越好",什麼東西都用索引是錯誤的。每個額外的索引都要佔用額外的磁碟空間,並降低寫操作的效能。在修改表的內容時,索引必定進行更新,有時可能需要重構,因此,索引越多,所花的時間越長。如果一個索引很少使用或從不使用,那也會不必要的減緩表的修改速度。此外,mysql在生成一個執行計劃時,需要考慮各個索引,這也要花費時間。建立多餘的索引給查詢優化帶來了更多的工作。索引太多也可能會使mysql選擇不到所要使用的最好索引。只保持所需的索引有利於查詢優化

6、對於innodb儲存引擎的表,記錄預設會按照一定的順序儲存,如果有明確定義的主鍵,則會按照主鍵順序儲存。如果沒有主鍵,但有唯一索引,那麼就會按照唯一索引的順序儲存。如果既沒有主鍵又沒有唯一索引,那麼表中會自動生成一個內部列,按照這個列的順序儲存。按照主鍵或者內部列的順序進行訪問的速度是最快的,索引innodb表儘量自己指定主鍵,當表中同時有幾列都是唯一的,都可以作為主鍵的時候,要選擇最常最為訪問條件的列作為主鍵,提高查詢的效率。另外,還需要注意,innodb表的普通索引都會儲存主鍵的鍵值,所以主鍵要儘可能選擇較短的資料型別,可以有效地減少索引的磁碟佔用,提高索引的快取效果

hash 索引結構的特殊性,其檢索效率非常高,索引的檢索可以一次定位,不像b-tree索引需要從根節點到枝節點,最後才能訪問到頁節點這樣多次的io訪問,所以 hash 索引的查詢效率要遠高於 b-tree索引

1)hash索引僅僅能滿足"=","in"和"<=>"查詢,不能使用範圍查詢。

由於 hash 索引比較的是進行 hash 運算之後的 hash值,所以它只能用於等值的過濾,不能用於基於範圍的過濾,因為經過相應的 hash演算法處理之後的 hash 值的大小關係,並不能保證和hash運算前完全一樣。

2)hash 索引無法被用來避免資料的排序操作。

由於 hash 索引中存放的是經過 hash 計算之後的 hash值,而且hash值的大小關係並不一定和 hash運算前的鍵值完全一樣,所以資料庫無法利用索引的資料來避免任何排序運算;

3)hash索引不能利用部分索引鍵查詢。

對於組合索引,hash 索引在計算 hash 值的時候是組合索引鍵合併後再一起計算 hash 值,而不是單獨計算 hash值,所以通過組合索引的前面一個或幾個索引鍵進行查詢的時候,hash 索引也無法被利用。

4)hash索引在任何時候都不能避免表掃描。

前面已經知道,hash 索引是將索引鍵通過 hash 運算之後,將 hash運算結果的 hash值和所對應的行指標資訊存放於一個 hash 表中,由於不同索引鍵存在相同 hash 值,所以即使取滿足某個 hash 鍵值的資料的記錄條數,也無法從 hash索引中直接完成查詢,還是要通過訪問表中的實際資料進行相應的比較,並得到相應的結果。

5)hash索引遇到大量hash值相等的情況後效能並不一定就會比b-tree索引高

對於選擇性比較低的索引鍵,如果建立 hash 索引,那麼將會存在大量記錄指標資訊存於同一個 hash 值相關聯。這樣要定位某一條記錄時就會非常麻煩,會浪費多次表資料的訪問,而造成整體效能

mysql之索引

檢視索引 刪除索引 首發日期 2018 04 14 在現有表結構的情況下增加索引 create index 索引名 on 表名 欄位 索引的長度 asc desc 在現有表結構的情況下增加索引 alter table 表名 add index key 索引名 欄位 索引的長度 asc desc 在現...

MySQL之索引

1 什麼是索引 索引是幫助mysql高效獲取資料的資料結構,索引的本質就是資料結構。可以理解為排好序快速查詢的資料結構 結論 資料本身之外,資料庫還維護著一個滿足特定查詢演算法的資料結構,這些資料結構以某種方式指向資料,這樣就可以在這些資料結構的基礎上實現高階查詢演算法,這種資料結構就是索引。一般來...

MySQL進階之索引

資料庫查詢是資料庫的最主要的功能之一,資料庫系統的設計者從查詢演算法的角度對資料庫進行了一定的優化。最基本的順序查詢演算法的複雜度為o n 在資料量很大的時候演算法的效率是很低的。雖然也有一些更優秀的查詢演算法 二分查詢 二叉樹查詢,但這些演算法都只能應用在特定的資料結構之上,如二分查詢要求被檢索資...