mysql怎麼給字串欄位加索引?

2021-09-27 02:23:29 字數 1680 閱讀 8736

案例:給郵箱加索引

-- 普通索引,包含了每個記錄的整個字串;

alter

table

user

addindex index1(email)

;-- 字首索引,對於每個記錄都是只取前 6 個位元組

alter

table

user

addindex index2(email(6)

);

字首索引:

優點:占用空間比較小

缺點:會增加額外的掃瞄次數

執行以下sql

select id,name,email from suser where email=

'zhangssxyz@***.com'

;

根據實際效果,使用字首索引,要定義和長度,就可以做到既節省空間,有不用額外增多太多的查詢成本

怎麼才能確定我該使用多長的字首呢?

關注區分度,區分度越高,意味著重複的值越少,索引要統計帶建立的索引上有多少不同的值,建議使用以下sql取統計一下有多少個不同的值

使用字首索引會損傷區分度,一般選擇不小於95%的比例

select

count

(distinct email)

as l from suser;

-- 統計4-7個位元組的字首索引

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

(eamil,7)

)as l7

from suer;

使用字首索引就用不上覆蓋索引對查詢效能的優化了,這個也是在選擇是否使用字首索引時需要考慮的乙個因素】、

例如身份證號?

使用倒序儲存

-- 一般身份證號後6位不會重複

select field_list from t where id_card = reverse(

'input_id_card_string'

)

使用hash欄位

--在表上建立乙個整數字段,儲存身份證號的校驗碼,同時在這個欄位上建立索引

alter

table t add id_card_crc int

unsigned

,add

index

(id_card_crc)

-- 因為crc32()函式,得到的結果可能重複,所以需要增加判斷

select field_list from t where id_card_crc = crc32(

'input_id_card_string'

)and id_card=

'input_id_card_string'

這兩種手段都不支援範圍查詢,

怎麼給字串欄位加索引?

1 使用字首索引的時候,需要定義好長度,能節省空間,又能減少查詢成本 mysql select count distinct left email,4 as l4,count distinct left email,5 as l5,count distinct left email,6 as l6,...

mysql怎麼加索引 mysql怎麼新增索引

在mysql中可以通過使用alter table這個sql語句來為表中的字段新增索引。1 新增primary key 主鍵索引 mysql alter table table name add primary key column 2 新增unique 唯一索引 mysql alter table ...

初學MySQL 如何給字串加索引?

例如對於乙個支援郵箱登入的系統,如何在這個欄位上建立合理的索引?在email欄位上建立索引的語句如下 alter table suser add index index1 email alter table suser add index index2 email 6 建立的index1索引中,包含...