[轉]MySQL 前綴索引--------mysql索引指定指定一個前綴長度


 

原文: https://www.cnblogs.com/niuben/p/13188277.html

--------------------------------

索引前綴

使用 字符串列的索引規范中的語法,您可以創建僅使用列首字符的索引 。以這種方式僅索引列值的前綴可以使索引文件小得多。為a 或 column 編制索引時 , 必須為索引指定前綴長度。例如: col_name(N)NBLOBTEXT

復制代碼
CREATE TABLE test (blob_col BLOB, INDEX(blob_col(10))); 

前綴最長可以為1000個字節(InnoDB表中為767個字節 ,除非已 innodb_large_prefix設置)。

注意 前綴限制以字節為單位,而在前綴長度CREATE TABLE, ALTER TABLE和 CREATE INDEX語句被解釋為非二進制串類型的字符數(CHAR, VARCHAR, TEXT對於二進制串類型),並且字節數(BINARY, VARBINARY, BLOB)。為使用多字節字符集的非二進制字符串列指定前綴長度時,請考慮到這一點。
如果搜索詞超過索引前綴長度,則使用索引排除不匹配的行,然后檢查其余行是否可能匹配。


當要索引的列字符很多時 索引則會很大且變慢
( 可以只索引列開始的部分字符串 節約索引空間 從而提高索引效率 )

原則: 降低重復的索引值

例如現在有一個地區表

area gdp code
chinaShanghai 100 aaa
chinaDalian 200 bbb
usaNewYork 300 ccc
chinaFuxin 400 ddd
chinaBeijing 500 eee

發現 area 字段很多都是以 china 開頭的
那么如果以前1-5位字符做前綴索引就會出現大量索引值重復的情況
索引值重復性越低 查詢效率也就越高


前綴索引測試

復制代碼
// 創建一個測試表
CREATE TABLE `x_test` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `x_name` varchar(255) NOT NULL, `x_time` int(10) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=4145025 DEFAULT CHARSET=utf8mb4 // 添加200萬條測試數據 INSERT INTO x_test(x_name,x_time) SELECT CONCAT(rand()*3300102,x_name),x_time FROM x_test WHERE id < 30000; 

1.在無任何索引的情況下隨便查詢一條

復制代碼
SELECT * FROM x_test WHERE x_name = '1892008.205824857823401.800099203178258.8904820949682635656.62526521254'; 

查詢時間:2.253s

2.添加前綴索引 ( 以第一位字符創建前綴索引 )

復制代碼
alter table x_test add index(x_name(1)) 

再次查詢相同sql語句

復制代碼
SELECT * FROM x_test WHERE x_name = '1892008.205824857823401.800099203178258.8904820949682635656.62526521254'; 

查詢時間:3.291s
當使用第一位字符創建前綴索引后 貌似查詢的時間更長了
因為只第一位字符而言索引值的重讀性太大了
200萬條數據全以數字開頭那么平均20萬條的數據都是相同的索引值

3.重新建立前綴索引 這次以前4位字符來創建

復制代碼
alter table x_test add index(x_name(4)); 

再次查詢相同sql語句

復制代碼
SELECT * FROM x_test WHERE x_name = '1892008.205824857823401.800099203178258.8904820949682635656.62526521254'; 

查詢時間:0.703s
這次以前4位創建索引 大大減少了索引值的重復性 查詢速度從3秒提升到0.7秒

4.200萬條數據都以數字開頭 而0-9排列組合7位則可達到千萬種組合
也就是以前7位來做索引則不會出現重復索引值的情況了

復制代碼
alter table x_test add index(x_name(7)); 

再次查詢相同sql語句

復制代碼
SELECT * FROM x_test WHERE x_name = '1892008.205824857823401.800099203178258.8904820949682635656.62526521254'; 

查詢時間:0.014s ( 首次執行無緩存狀態下 )


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM