Mysql对字符串一部分添加索引

例如在公司中,每个人的工作邮箱@之后的内容是一样的,那如何只对@之前的字符串创建索引呢?

首先需要了解以下几点:

一、MySQL中字符串的截取

MySQL中有专门的字符串截取函数:其中常用的有两种:

substring_index(str,delim,count) 和concat

 

1.substring_index(str,delim,count) 函数的使用较为普遍。

函数括号里面的依次为:

要分隔截取的字符串(如:”aaa_bbb_ccc”)、分隔符(如:“_”)

位置(表示第几个分隔符处,如:“1”)

count为正数,那么就是从左边开始数,函数返回第count个分隔符的左侧的字符串;

count为负数,那么就是从右边开始数,函数返回第count个分隔符右边的所有内容;

count可以为0,返回为空。


例子:

substring_index("aaa_bbb_ccc","_",1) ,返回为 aaa;

substring_index("aaa_bbb_ccc","_",2) ,返回为 aaa_bbb;

substring_index(substring_index("aaa_bbb_ccc","_",-2),"_",1) ,返回为 bbb;

2.concat是连接几个字符串

例子:concat(‘m’,’y’,’s’,’q’,’l’);

返回:mysql

 

二、依据表中的某个字段查询包含有这个字符的所有数据

1.查询user表中所有name包含“吴”的数据 

find_in_set:SELECT * FROM user WHERE find_in_set(‘吴’,name); 

2.使用正则,查询包含刘或者吴的数据

REGEXP:SELECT * FROM user WHERE name REGEXP ‘(‘吴’|‘刘’)’; 

 

三、使用

索引的设计者提出了个方案 --- 只对字符串的前几个字符进行索引。通过字符串的前几个字符我们已经能大概排序字符串了,剩下不能排序的可以通过遍历进行查找啊,这样只在B+树中存储字符串的前几个字符的编码,既节约空间,又减少了字符串的比较时间,还大概能解决排序的问题,何乐而不为,比方说我们在建表语句中只对name列的前10个字符进行索引可以这么写:

CREATE TABLE person_info(
    name VARCHAR(100) NOT NULL,
    KEY name (name(10))
);    

name(10)就表示在建立的B+树索引中只保留记录的前10个字符的编码,这种只索引字符串值的前缀的策略是我们非常鼓励的,尤其是在字符串类型能存储的字符比较多的时候。

 

对于最开始的问题:如何只对@之前的字符串创建索引

CREATE TABLE person_info(
    email VARCHAR(100) NOT NULL,
    KEY email (substring_index(name,'@',1))
);    

 

你可能感兴趣的:(MySQL)