mysql-字符串如何創建索引(11)


一,直接創建完整索引,但是會占用大量空間

        select * from t where a = "xxx"; 這條sql,如果創建完整索引的話,他的流程是:先去a索引樹查詢,獲取到一條記錄的主鍵id;到主鍵上根據該主鍵id查詢行,判斷a是否正確,加入結果集;取a索引樹下一個位置數據,發現不滿足循環結束。

二,mysql支持前綴索引

       也就是說你可以定義字符串的一部分作為索引,默認不指定會創建完整索引。但是前綴索引會導致覆蓋索引失效(需要回表獲取數據)

       select * from t where a = "abe"; 這條sql,如果創建前綴索引的話。索引假如為a(2),有三條數據abc,abd,abe,那么查詢流程是:去a索引樹上查詢,獲取到adc行,回主鍵查詢該行不滿足直接丟棄,接着獲取a樹下一位置,獲取到行abd,回主鍵查詢發現不符合,直接丟棄,繼續取發現滿足,則假如。一直循環,直到索引樹取到的不是“ab”時結束。

       建立前綴索引要區分到第幾位呢,我們需要統計索引列數據的區分度:使用如下sql:select count(distinct email) as L from user;   select count(left(email,4)) as L4 from user; .....

       這種方式顯而易見,會導致查詢掃描次數增加。

三,倒序索引的使用

        比如某個字段存儲的是身份證號,我們知道索引列的差異性越大,使用索引的收益越高,如果我們使用前綴索引的話,因為身份證號前幾位標識的地區碼,重復較多,如果建立前綴索引的話,要建立12位才能滿足一定的區分度。但是顯然是浪費空間的。那么我們可以建立數據的倒序索引,新建數據時倒序插入,查詢時使用 select * from t where id_card = reverse(idCard)進行查詢。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM