这里主要介绍 MySQL 的前缀索引。从名字上来看,前缀索引就是指索引的前缀,当然这个索引的存储结构不能是 HASH,HASH 不支持前缀索引。 先看下面这两行示例数据: 你是中国人吗?是的是的是的是的是的是的是的是的是的是的 确定是中国人?是的是的是的是的是的是的是的是的是的是的 这两行数据有一个共同的特点就是前面几个字符不同,后面的所有字符内容都一样。那面对这样的数据,我们该如何建立索引呢? 大致有以下 3 种方法: 拿整个串的数据来做索引 这种方法来的最简单直观,但是会造成索引空间极大的浪费。重复值太多,进而索引中无用数据太多,无论写入或者读取都产生极大资源消耗。 将字符拆开,将一部分做索引 把数据前面几个字符和剩余的部分字符分拆为两个字段 r1_prefix,r1_other,针对字段 r1_prefix 建立索引。如果排除掉表结构更改这块影响,那这种方法无疑是最好的。 把前面 6 个字符截取出来的子串做一个索引 能否不拆分字段,又能避免太多重复值的冗余?我们今天讨论一下前缀索引。 前缀索引 前缀索引就是基于原始索引字段,截取前面指定的字符个数或者字节数来做的索引。 MySQL 基本上大部分存储引擎都支持前缀索引,目前只有字符类型或者二进制类型的字段可以建立前缀索引。比如:CHAR/VARCHAR、TEXT/BLOB、BINARY/VARBINARY。 字符类型基于前缀字符长度,f1(10) 指的前 10 个字符; 二进制类型基于字节大小,f1(10) 指的是前 10 个字节长度; TEXT/BLOB 类型只支持前缀索引,不支持整个字段建索引。 举个简单例子,表 t1 有两个字段,针对字段 r1 有两个索引,一个是基于字段 r1 的普通二级索引,另外一个是基于字段r1的前缀索引。 <localhost|mysql>show create table t1\G *************************** 1. row *************************** Table: t1 Create… Continue reading MYSQL前缀索引