BLOB
、
TEXT
、
VARCHAR
,就 "必須" 使用
前綴索引,即將值的前一部分做爲索引。由於索引的存儲也是須要空間的,一樣索引太長維護起來也比較困難。
User
表中的郵箱添加前綴索引,以下:
alter table user add index index1(email(7));
複製代碼
email
的所有做爲索引和前7個字符做爲索引來看看在性能上有什麼差別。創建索引的語句以下:
alter table user add index index1(email);
alter table user add index index2(email(7));
複製代碼
user
表中有這樣幾條數據(id,name,email):
(1,"陳某","chenmou1993@xxx")
、
(2,"張某","chenmou1994@xxx")
、
(3,"李某","chenmou1995@xxx")
、
(4,"王某","chenmou1996@xxx")
。
select * from user where email="chenmou1995@xxx";
複製代碼
【1】普通索引的執行過程sql
chenmou1995@xxx
的這條記錄,取得
id=2
的值;
id=2
的行,判斷email的值是正確的,將這行記錄加入結果集;
index1
索引樹上剛剛查到的位置的下一條記錄,發現已經不知足
email=chenmou1995@xxx
的條件了,循環結束。
這個過程當中,只須要回主鍵索引取一次數據,因此係統認爲只掃描了一行。數據庫
【2】前綴索引的執行過程性能優化
chenmou
的記錄,找到的第一個是id=1;
chenmou1995@xxx
,這行記錄丟棄;
chenmou
,取出id=2,再到ID索引上取整行而後判斷,此次值對了,將這行記錄加入結果集;
chenmou
時,循環結束。
在這個過程當中,要回主鍵索引取4次數據,也就是掃描了4行。bash
chenmou1995
的記錄只有一個,這樣就能夠直接定位到
id=2
,此時不但空間縮小了,掃描的行數也減小了。
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】倒序存儲微信
若是你存儲身份證號的時候把它倒過來存,每次查詢的時候,你能夠這麼寫:session
select field_list from t where id_card = reverse('輸入的身份證號');
複製代碼
因爲身份證號的最後6位沒有地址碼這樣的重複邏輯,因此最後這6位極可能就提供了足夠的區分度。固然了,實踐中你不要忘記使用count(distinct)
方法去作個驗證。性能
select id,name from user where email="chenmou1995@xxx";
複製代碼