MySQL的前缀索引
微信棋牌源码咨询Q 2171793408
官网地址:http://wowotouba.com/h5
MySQL的前缀索引指的是对指定的栏位的前面几位建立的索引。
Altertable Table_Name add key(column_name(prefix_len));
或者
Createindex index_name on Table_Name(column_name(prefix_len));
建立前缀索引后,可以直接当做普通索引进行过滤。
Select ..from table_name where column_name=’…’;
前缀索引的最大的好处是降低索引的大小。另外,由于InnoDB单列索引长度不能超过767bytes,如果是text或者blob字段,直接建立索引可能会报错,而前缀索引可以绕过这一限制。
微信棋牌源码咨询Q 2171793408
官网地址:http://wowotouba.com/h5
做个测试看一下。
delimiter;;
dropFUNCTION if exists random_str;;
CREATEFUNCTION random_str(n int) RETURNS varchar(30000)
begin
declarereturn_str varchar(30000) default "";
declare iint default 0;
whilelength(return_str) < n do
setreturn_str=concat(return_str,md5(rand()));
endwhile;
returnsubstring(return_str,1,n);
end;;
首先,创建一个生成超过1000长度的随机字符串的函数。
创建测试表
CREATETABLE TEST_PREFIX_IND (
ID INT(10) PRIMARY KEY AUTO_INCREMENT,
NORMAL_STR VARCHAR(20) ,
LONG_STR VARCHAR(1000),
TEXT_STR TEXT,
BLOB_STR BLOB
);
插入10000行记录:
drop procedure if exists init_test_prefix_ind;;
createprocedure init_test_prefix_ind(n int)
begin
declare iint default 0;
while i< n do
insertinto test_prefix_ind(NORMAL_STR,long_str, TEXT_STR,BLOB_STR)
values(random_str(20),random_str(rand()*1000+1),random_str(rand()*1000+1),random_str(rand()*300+1));
seti=i+1;
endwhile;
end;;
callinit_test_prefix_ind(10000);;
尝试在类型为varchar(1000)的LONG_STR创建索引
altertable test_prefix_ind add key(LONG_STR);;
成功了,但是Sub_part显示为767,表示系统自动创建了前缀长度为767的前缀索引;
微信棋牌源码咨询Q 2171793408
官网地址:http://wowotouba.com/h5
原文地址:https://www.cnblogs.com/SSJDSD/p/8514708.html