整個email欄位新增索引add index index1(email)
利用字首長度來新增索引add index index2(email(6))
由於 email(6) 這個索引結構中每個郵箱欄位都只取前 6 個位元組,所以占用的空間會更小,這就是使用字首索引的優勢,可能會增加額外的記錄掃瞄次數。
通過下面**測試字首索引的區分度:
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 test;
這樣的做的好處是,區分度越大,掃瞄次數越少。
字首索引用不上覆蓋索引對查詢效能的優化,選擇是否使用字首索引時需要考慮的乙個因素。
國家的身份證號,一共 18 位,其中前 6 位是位址碼,所以同乙個縣的人的身份證號前 6 位一般會是相同的,所以對身份證號做長度為 6 的字首索引的話,這個索引的區分度就非常低了,
按照前面做法,可能需要建立長度為 12 以上的字首索引,才能夠滿足區分度要求。但是,索引選取的越長,占用的磁碟空間就越大,相同的資料頁能放下的索引值就越少,搜尋的效率也就會越低。
身份證號的後6位區分度很高,我們可以把身份證號倒過來存,取前6位做索引。
select
*from test where id_card = reverse(
'input_id_card'
);
使用 hash(crc32()) 字段,在表上再建立乙個整數字段,來儲存身份證的校驗碼,同時在這個欄位上建立索引。
mysql>
alter
table test add id_card_crc int
unsigned
,add
index
(id_card_crc)
;//每次插入新記錄的時候,都同時用 crc32() 這個函式得到校驗碼填到這個新字段
//兩個不同的身份證號通過 crc32() 函式得到的結果可能是相同的,所以你的查詢語句 where 部分要判斷 id_card 的值是否精確相同
mysql>
select
*from test where id_card_crc=crc32(
'input_id_card'
)and id_card=
'input_id_card'
使用crc32後索引的長度變成了 4 個位元組,比原來小了很多。
這二種索引的相同點:都不支援範圍查詢。
這二種索引的不同點:
關於MYSQL字串
字串是多個字元組成的乙個字串行,由單引號 或雙引號 字元包圍。但在 ansi 模式中執行時只能用單引號 例如 a string another string 在乙個字串中,如果某個序列具有特殊的含義,每個序列以反斜線符號 開頭,稱為轉義字元。mysql 識別下列轉義字元 0 乙個 ascii 0 n...
關於mysql中int欄位傳入字串查詢引發的問題
昨天工作的時候,一位同事遇到了乙個很奇怪的問題,讓我過去看一下,重新整理了我對mysql的認知 具體什麼問題呢,如下圖 我帶入的ofirst條件是一串uuid,但是查詢出值為100的結果,知識庫明顯不夠用。苦思了好幾分鐘,無從下手。然後我們部門的經理過來了,就問了一下他,他看了一眼就發現了問題的所在...
mysql關於字串字段資料型別
字串型別指char varchar binary varbinary blob text enum和set。該節描述了這些型別如何工作以及如何在查詢中使用這些型別。型別大小 用途char 0 255位元組 定長字串 varchar 0 65535 位元組 變長字串 tinyblob 0 255位元組...