11 怎麼給字串欄位加索引
字首索引的優勢,選取欄位前幾個作為索引,占用的空間更小
使用字首索引,定義好長度,就可以做到既節省空間,又不用額外增加太多的查詢成本。
建立索引的時候關注的是區分度,區分度越高越好,區分度越高,意味著重複的鍵值越少,因此,可以通過統計索引上有多少不同的值來判斷使用多長字首。
mysql> select count(distinct email) as l from suser;
然後選取不同長度的字首來看這個值,
mysql> select
count(distinct left(email,4))as l4,
count(distinct left(email,5))as l5,
count(distinct left(email,6))as l6,
count(distinct left(email,7))as l7,
from suser;
使用字首索引可能會損失區分度。
使用字首索引的時候就用不上覆蓋索引對查詢效能的優化,這也是選擇是否使用字首索引需要的考慮因素。
實際情況可以根據區分度來看使用什麼儲存,
倒序儲存和使用hash欄位的異同點
從占用的額外空間來看,倒序儲存方式在主鍵索引上,不會消耗額外的儲存空間,而 hash 字段方法需要增加乙個字段。當然,倒序儲存方式使用4個位元組的字首長度應該是不夠的,如果再長一點,這個消耗和額外這個hash欄位差不多抵消。
cpu消耗方面,倒序方式讀和寫的時候,需要額外呼叫一次reverse函式,而hash欄位的方式需要額外呼叫一次crc32()函式,如果從兩個函式的計算複雜度來看,reverse函式額外消耗的cpu資源會更小些。
查詢效率來看,使用hash欄位方式的查詢效能相對穩定一些。因為crc32算出來的值雖然有衝突的概率,但概率非常小,可以認為每次查詢的平均掃瞄行數接近1。
小結
使用字串建立索引的場景
1.直接建立完整索引,這樣可能比較占用空間,
2.建立字首索引,節省空間,但會增加查詢掃瞄次數,並且不能使用覆蓋索引
3.倒序儲存,在建立字首索引,用於繞過字串本身字首的區分度不夠的問題。
4.建立hash欄位索引,查詢效能穩定,有額外的儲存和計算消耗,都不支援範圍掃瞄。
mysql實戰45講學習筆記 02
2.日誌系統 一條sql更新語句是如何執行的 一條查詢語句執行過程是經過聯結器,分析器,優化器,執行器等功能模組最後到達儲存引擎 查詢語句的流程,更新語句也是會同樣走一遍。更新流程還涉及兩個重要的日誌系統,redo log 重做日誌 和binlog 歸檔日誌 重要的日誌模組 redo log mys...
mysql實戰45講學習筆記 12
為什麼我的mysql 抖 了一下一條sql語句,正常執行的時候特別快,但有時會突然變得特別慢,並且隨機,持續時間短。將對應的記憶體資料寫入到磁碟的過程,叫做flush。當記憶體資料頁跟磁碟資料頁內容不一致的時候,我們稱這個記憶體頁為 髒頁 記憶體資料寫入到磁碟後,記憶體和磁碟上的資料頁就一致,稱為 ...
mysql實戰45講學習筆記 15
15 日誌和索引相關問題1.在兩階段提交的不同瞬間,mysql如果發生異常重啟,是怎樣保證資料完整性的。如果在圖中a的地方,也就是寫入redo log處於prepare階段之後,寫binlog之前,發生了崩潰 crash 由於此時binlog還沒寫,redolog還沒提交,所以崩潰恢復的時候。事務會...