場景一,根據郵箱登錄是一個普遍場景,如果郵箱不加索引則需要全表掃描,而如果加入全量索引則需要占用很大的空間。由於字符串索引支持最左前綴原則,則我們可以這樣創建索引:
alter table user add index index(email(5));
這里設置email的最左前5個字符作為索引可以縮小范圍,但是如果前5個字符可能重復的數據很多,比如
zhangsan@XX.com、
zhangsi@XX.com、
zhangwu@XX.com、
zhangliu@XX.com、
zhangqi@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');