例如在公司中,每个人的工作邮箱@之后的内容是一样的,那如何只对@之前的字符串创建索引呢?
首先需要了解以下几点:
MySQL中有专门的字符串截取函数:其中常用的有两种:
substring_index(str,delim,count) 和concat
函数括号里面的依次为:
要分隔截取的字符串(如:”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;
例子: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))
);