字符串應該如何創建索引?


場景一,根據郵箱登錄是一個普遍場景,如果郵箱不加索引則需要全表掃描,而如果加入全量索引則需要占用很大的空間。由於字符串索引支持最左前綴原則,則我們可以這樣創建索引:

alter table user add index index(email(5));


這里設置email的最左前5個字符作為索引可以縮小范圍,但是如果前5個字符可能重復的數據很多,比如 zhangsan@XX.comzhangsi@XX.comzhangwu@XX.comzhangliu@XX.comzhangqi@XX.com都會搜索出來在遍歷,區別度太小,在某字段簡歷索引的一個原則就是這個字段的區別度,如此建立索引區別度太小。所以應該取得區別度可接受的最左前綴。
select count(distinct email) as L from user;(查詢總數)

然后執行下列語句,來看每個前綴長度索引的區別度,找一個能夠接受的長度,比如你的要求是區別度大於95%,那么可以算一下多長的前綴符合你的要求,區別度=L(n)/L。
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 user;
 
場景二,還是身份證的場景,根據身份證進行等值查詢,應該如何建立索引? 提供兩種方案:
  1.因為身份證前面都是省市生日等重復較多的信息,所以這里可以考慮倒序存儲,並選擇一個長度,比如倒數8位作為前綴索引。
select field_list from t where id_card = reverse('input_id_card_string');

2.第二種是用hash,在創建一個身份證hash字段,用這個字段作為索引。
  alter table t add id_card_crc int unsigned, add index(id_card_crc);
查詢時候用以下語句:

select field_list from t where id_card_crc=crc32('input_id_card_string') and id_card='input_id_card_string');




免責聲明!

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



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