InnoDB單列索引長度不能超過767bytes,聯合索引還有一個限制是長度不能超過3072。
所以長字符串字段 用B+
樹完整建立索引是不行的,而且空間占用也太大了。
對於長字符串,有兩種方法建立索引:
1.模擬哈希索引
新建一列用於存儲該字符列的hash值(哈希函數不要使用SHA1(),MD5(),因為會產生很長的字符串,浪費空間,比較也慢,最好是返回整數的hash函數),在該列建立索引,查詢時必須在where子句中包含常量值,以避免hash沖突(
例如:SELECT id
FROM urlT
WHERE url_hash = hash('www.blog.csdn.net')
AND url = 'www.blog.csdn.net')。
2.使用前綴索引
要考慮選擇足夠長的前綴以保證較高的選擇性,同時又不能太長(以便節約空間),最后還要考慮數據分布。
只對字符串的前幾個字符進行索引。
通過字符串的前幾個字符我們已經能大概排序字符串了,剩下不能排序的可以通過遍歷進行查找啊,
這樣只在B+樹中存儲字符串的前幾個字符的編碼,既節約空間,又減少了字符串的比較時間,還大概能解決排序的問題,
比方說我們在建表語句中只對name列的前10個字符進行索引可以這么寫:
CREATE TABLE person_info( name VARCHAR(100) NOT NULL, birthday DATE NOT NULL, phone_number CHAR(11) NOT NULL, country varchar(100) NOT NULL, KEY idx_name_age_birthday (name(10), birthday, phone_number) );
name(10)就表示在建立的B+樹索引中只保留記錄的前10個字符的編碼,
這種只索引字符串值的前綴的策略是我們非常鼓勵的,尤其是在字符串類型能存儲的字符比較多的時候。
摘自: