例如對於乙個支援郵箱登入的系統,如何在這個欄位上建立合理的索引?
在email欄位上建立索引的語句如下:
alter table suser add index index1(email);
alter table suser add index index2(email(6));
建立的index1索引中,包含了每個記錄的整個字串;
建立的index2索引中,每個記錄只取前6個位元組;
但是使用字首索引,可能會導致查詢語句的讀資料的次數變多;
使用字首索引,定義好長度,就可以既能節省空間,也不用額外的增加查詢成本
建立索引應當關注的是區分度,區分度越高,重複的鍵值就越少
採用以下語句來判斷該列上有多少不同的值:
select count(distinct email) as l from suser;
依次選取不同長度的字首來看這個值:
mysql> 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 suser;
字首索引可能會增加掃瞄次數,也會影響效能;
使用了字首索引就用不上覆蓋索引對查詢效能的優化了,也是使用時需要考慮的乙個因素;
對於郵箱這種字串,使用字首索引的效果可能還不錯,但是遇到區分度不夠高的情況,例如身份證號有18位,前六位是位址碼,那如果建立長度12以上的字首索引,才能夠滿足區分度的話,索引選取的越長,占用的磁碟空間就越大,相同資料頁放入的索引值就越少,搜尋的效率也就會越低。
如何既可以占用更小的空間,又能達到相同的查詢效率呢?
select field_list from t where id_card = reverse("input_id_card_string");
mysql> alter table t add id_card_crc int unsigned, add index(id_card_crc);
每次插入新記錄,都使用crc32()這個函式得到校驗碼填寫到新字段中,由於校驗碼可能存在hash衝突,需要在查詢語句中判斷id_card的值是否精確相同。
兩種方式的異同點:
相同點:
二者都不支援範圍查詢,倒序儲存無法採用範圍查詢,hash欄位只支援等值查詢;
不同點:
mysql怎麼給字串欄位加索引?
案例 給郵箱加索引 普通索引,包含了每個記錄的整個字串 alter table user addindex index1 email 字首索引,對於每個記錄都是只取前 6 個位元組 alter table user addindex index2 email 6 字首索引 優點 占用空間比較小 缺點...
mysql 如何加索引 mysql如何新增索引
mysql新增索引的方法 可以通過 create table 語句來新增,如 constraint primary key index 表示建立一般索引。在mysql中可以在建立表 create table 的同時建立索引 也可以在建立表後建立索引,使用create index語句或alter ta...
阿里百度華為如何使用MySQL給字串加索引
現在主流 都支援手機號登入,如何在手機號這樣的字串字段建立合適的索引呢?假設,你現在維護乙個支援郵箱登入的系統,使用者表是這麼定義的 create table suser id bigint unsigned primary key,email varchar 64 engine innodb 要使...