索引字首
使用 字串列的索引規範中的語法,您可以建立僅使用列首字元的索引 。以這種方式僅索引列值的字首可以使索引檔案小得多。為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
gdpcode
chinashanghai
aaachinadalian
bbbusanewyork
cccchinafuxin
dddchinabeijing
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.新增字首索引 ( 以第一位字元建立字首索引 )
alter table x_test add index(x_name(1))
再次查詢相同sql語句
select * from x_test where x_name = '1892008.205824857823401.800099203178258.8904820949682635656.62526521254';
當使用第一位字元建立字首索引後 貌似查詢的時間更長了
因為只第一位字元而言索引值的重讀性太大了
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';
這次以前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';
mysql 字首索引 語法 mysql字首索引
應用場景 資料庫裡有個位址 address 字段,型別為varchar 100 業務決定了要經常根據address來進行查詢。確定選擇性 sql select count distinct address count as selectivity from info selectivity 0.87...
mysql 索引語法 MySQL索引的基本語法
索引是排好序的資料結構!可以用在 where 條件查詢的字段,和order by 排序的字段,有了索引,便可以快速地定位資料所在的實體地址並找出來。索引的分類 1.普通索引 normal 沒有任何約束,主要用於提高查詢效率 2.唯一索引 unique 在普通索引的基礎上增加了資料唯一性的約束,可以有...
mysql索引語法 MySQL建立索引的語法
建立表時建立索引 語法 create table 表名 屬性名 資料型別 完整性約束條件 unique fulltext spatial index key 別名 屬性名 1 長度 asc desc 1 建立普通索引 create table index1 id int,name varchar 2...