mysql 學習(七)關於字串欄位加索引

2021-10-24 16:50:34 字數 1557 閱讀 9395

整個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位元組...