前缀索引的优点:索引字段长度短,索引文件占用空间小 前缀索引的缺点: 增加额外的扫描行数: 因为前缀索引截取了字符串字段的部分字符,字段具有的唯一性会被破坏,索引树上可能存在多个相同的字段,必须...
1. 字符串索引的类别:
全字符串长度完整索引前缀索引字段倒序存储 + 前缀索引(相当于倒序后缀索引)新建字符串hashcode字段作为索引

前缀索引的优点:索引字段长度短,索引文件占用空间小

前缀索引的缺点:

增加额外的扫描行数:
因为前缀索引截取了字符串字段的部分字符,字段具有的唯一性会被破坏,索引树上可能存在多个相同的字段,必须进行多次回表查询,比如在以下用户的邮箱上分别建立全字符串索引和前缀索引
结合下图进行分析,顺便回顾MySQL的数据查询顺序
前缀索引只截取前六个字符的话索引树上就有四个一样的节点,因此必须在主表中依次查找ID1-4的记录行(回表四次),找出所有满足条件的记录。(因为不保证邮箱号唯一,可能多行记录用的是同一个邮箱)
使用前缀索引的话就不能使用覆盖索引
覆盖索引的好处就是直接从索引树的节点中拿到其他需要的字段值,比如这里只查询id和email字段值(索引树节点上挂的就是ID),那么就不需要回表查找name字段值。
但是前缀索引必须要进行回操作,因为索引树中只是截取了索引字段的部分字符,MySQL必须从主表中取出索引节点中查到的ID记录行的数据,比对该行数据的完整的email字段是否与where语句中的条件一致。(也就是无法避免回表== 无法使用覆盖索引)
3. 解决前缀长度问题的方法(倒序/hash):
1)可以比对索引基数与所有数据行的比值大小。(索引基数就是该索引字段取值不同的行数),再通过权衡选择合适的前缀长度。可以使用以下语句分别计算4,5,6,7个字节索引长度的索引区分度。
mysql> select count(distinct left(email,4))as L4, count(distinct left(email,5))as L5, count(distinct left(email,6))as L6, count(distinct left(email,7))as L7, from SUser;
2)使用倒序存储字段:如身份证号字段,往往后面几个字段是随机的,区分度高。(不支持范围查询)
3)对某个字段求hashcode并作为新的字段插入,并作为索引(hash的原理就是压缩算法,将长字符串压缩为短字符串,也不支持范围查询)
截取memory_usage字段中的小数值 并计算平均百分比表数据1.截取1.1 substring_index(关键字的索引开始截取,-1由最后往前截)1.1.11.1.2 再次截取(1 从最前完后截取,截取到%之前)1.2 substring1.2.1 INSTR1.2.2 ...

截取memory_usage字段中的小数值 并计算平均百分比

表数据
select * from test;
1.截取

1.1 substring_index(关键字的索引开始截取,-1由最后往前截)

1.1.1 从"("开始截取

select substring_index(memory_usage,'(',-1) as substr from test;

1.1.2 再次截取(1 从最前完后截取,截取到%之前)

select substring_index(substring_index(memory_usage,'(',-1),'%',1) as substr from test;

1.2 substring

配合获取索引的函数 instr()以及left 从左开始截取到某个索引为止, 同样可以实现

1.2.1 INSTR

select substring(memory_usage,INSTR(memory_usage,'(')+1) from test;

1.2.2 left

select left(substring(memory_usage,INSTR(memory_usage,'(')+1),INSTR(substring(memory_usage,INSTR(memory_usage,'(')+1),'%')-1) from test;
2.累加计算求平均
select sum(substring_index(substring_index(memory_usage,'(',-1),'%',1))/(select count(1) from test) as avgstr from test;
3.取两位小数
select round(sum(substring_index(substring_index(memory_usage,'(',-1),'%',1))/(select count(1) from test),2) as avgstr from test;
4.拼接%
select concat(round(sum(substring_index(substring_index(memory_usage,'(',-1),'%',1))/(select count(1) from test),2),'%') avgstr from test;
5.非0判断,分母不能为0,null->0 (select count(1) from test)
select	case when (select count(1) from test)>0	then concat(round(sum(substring_index(substring_index(memory_usage,'(',-1),'%',1))/(select count(1) from	test),2),'%')	else 0 end as avgstr from test;
其它:
CAST函数用于将某种数据类型的表达式显式转换为另一种数据类型。
语法:CAST (expression AS data_type)
一、mysql截取字符串函数 1、left(str,length) 从左边截取length 2、right(str,length)从右边截取length 3、substring(str,index)当index>0从左边开始截取直到结束 当index<0从右边开始截取直到...
练习截取字符串函数(五个)
mysql索引从1开始
一、mysql截取字符串函数
1、left(str,length) 从左边截取length
2、right(str,length)从右边截取length
3、substring(str,index)当index>0从左边开始截取直到结束 当index