先上結論:
方法有以下:
一、 使用前綴索引
可以根據以下方法確定合適的前綴長度(前綴索引很可能會損失區分度,所以需要預先設定一個可以接受的損失比例,比如 5%)
select count(distinct left(email,4))as L4 from SUser;
優點:如果定義好長度,可以做到既節省空間,又不用額外增加太多的查詢成本。
缺點:1.使用不了覆蓋索引(所以前綴索引如果要做復合索引最好放最右)
2.可能會因為區分度掃描更多行
二、倒序存儲(特定場景下可以提高區分度)
三、使用hash字段(在表上再創建一個整數字段,來保存校驗碼)
二、三兩者做比較:
1. 從占用的額外空間來看,倒序存儲方式在主鍵索引上,不會消耗額外的存儲空間,而 hash 字段方法需要增加一個字段。
但是倒序存儲方式使用 4 個字節的前綴長度往往是不夠的,如果再長一點,這個消耗跟額外這個 hash 字段也差不多抵消。
【占用空間差不多】
2.在 CPU 消耗方面,倒序方式每次寫和讀的時候,都需要額外調用一次 reverse 函數,而 hash 字段的方式需要額外調用一次 crc32() 函數。如果只從這兩個函數的計算復雜度來看的話,reverse 函數額外消耗的 CPU 資源會更小些。
【CPU消耗 二比三稍小】
3.從查詢效率上看,使用 hash 字段方式的查詢性能相對更穩定一些。因為 crc32 算出來的值雖然有沖突的概率,但是概率非常小,可以認為每次查詢的平均掃描行數接近 1。而倒序存儲方式畢竟還是用的前綴索引的方式,也就是說還是會增加掃描行數。
【查詢效率上,三比二好】
傳送門:【付費課程】
https://time.geekbang.org/column/article/71492