mysql前缀索引的索引选择性

mysql前缀索引的索引选择性mysql前缀索引的索引选择性一.基础概念在mysql中建立前缀索引的意义在于相对于整列建立索引,前缀索引仅仅是选择该列的部分字符作为索引,减少索引的字符可以节约索引空间,从而提高索引效率,但这样也会降低索引的选择性关于索引的选择性,它是指不重复的索引值(也称为基数cardinality)和数据表的记录总数的比值,范围从1/(数据表记录总数)到1之间。索引的选择性越高则查询效率越高,因为选

大家好,又见面了,我是你们的朋友全栈君。

mysql前缀索引的索引选择性

一. 基础概念
在mysql中建立前缀索引的意义在于相对于整列建立索引,前缀索引仅仅是选择该列的部分字符作为索引,减少索引的字符可以节约索引空间,从而提高索引效率,但这样也会降低索引的选择性
关于索引的选择性,它是指不重复的索引值(也称为基数cardinality)和数据表的记录总数的比值,范围从1/(数据表记录总数)到1之间。索引的选择性越高则查询效率越高,因为选择性高的索引可以让MySQL在查找时过滤掉更多的行。选择性为1的索引叫唯一索引,这是最好的索引选择性,性能也是最好的
建立合理前缀索引的诀窍在于要选择足够长的前缀以保证较高的选择性,同时又不能太长(以便节约空间)。前缀应该足够长,以使得前缀索引的选择性接近于索引的整个列。换句话说,前缀的基数应该接近于完整列的基数

二. 实地测试
① 创建测试表music,并插入一些数据

create table music( name varchar(30) );

insert into music values('BITE'),('There for you'),('Scarborough Fair'),('Shape of You'),('Marvin Gaye'),('Pretty Girl'),('Pretty Boy'),('Walk Away'),('YOUTH'),('Paris');

insert into music values ('Scarborough Fair'),('Shape of You'),('Marvin Gaye'),('Pretty Girl'),('Pretty Boy'),('Walk Away'),('YOUTH'),('Paris');

② 查看刚刚创建的表的完整列索引选择性

select count(distinct name) / count(*) from music;

完整列索引选择性

③ 找出合适的前缀长度

select count(distinct left(name,1))/count(*) as sel1, count(distinct left(name,2))/count(*) as sel2, count(distinct left(name,3))/count(*) as sel3, count(distinct left(name,4))/count(*) as sel4 from music;

索引

因为该测试表中插入的数据量少,所以可以看到当选择前两个字符作为前缀索引后,索引的选择性达到了0.5,接近完整列的索引选择性0.5556
④ 建立前缀索引并查看

alter table music add index music_index(name(2));

查看前缀索引

⑤ 前缀索引被使用

select * from music where name like 's%';

前缀索引被使用

三. 注意事项
① 前缀索引是一种能使索引更小,更快的有效办法,但另一方面也有其缺点:mysql无法使用其前缀索引做ORDER BY和GROUP BY,也无法使用前缀索引做覆盖扫描
② 要明确使用前缀索引的目的与优势:
.大大节约索引空间,从而提高索引效率
.对于 BOLB 、 TEXT 或者很长的 VARCHAR 类型的列,必须使用前缀索引,因为 MySQL 不允许索引这些列的完整长度
③ 前缀索引会降低索引的选择性
④ 真正的难点在于:要选择足够长的前缀以保证较高的选择性,同时又不能太长, 前缀的长度应该使前缀索引的选择性接近索引整个列,即前缀的基数应该接近于完整列的基数

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/142581.html原文链接:https://javaforall.net

(0)
上一篇 2022年5月23日 下午1:40
下一篇 2022年5月23日 下午1:40


相关推荐

  • activex控件被阻止怎么办_javascript console

    activex控件被阻止怎么办_javascript consoleActiveXObject对象启用和返回对自动化对象的引用。此对象仅用于实例化自动化对象,且此对象没有成员。警告:此对象为Microsoft扩展,仅在InternetExplorer中受支持,在Windows8.x应用商店应用中不受支持。语法:newObj=newActiveXObject(servername.typename[,location])参数:newObj:…

    2022年10月14日
    5
  • 搭建谷歌云

    搭建谷歌云GoogleCloud不需要任何money的,但是你需要你一张visa的信用卡,因为Google会验证账户的真实性,先从账户扣除1美元,过一会儿就会退回来的(一般5分钟左右)注意,搭建GoogleCloud的过程中,也是需要处于不被和谐的环境下的,至于如何获取Google账号,这里不做过多介绍。首先打开谷歌云,有账号就直接登录,没有就按照页面提示注册…

    2022年6月16日
    54
  • c语言网格搜索,使用逻辑回归时怎么利用网格搜索来查找degree,c等超参数

    c语言网格搜索,使用逻辑回归时怎么利用网格搜索来查找degree,c等超参数非常好的问题 如何将自定义的 Pipline 对象应用于 sklearn 内置的网格搜索确实是课程没有讲的一个 sklearn 使用上的语法细节 首先 你在 31 行的注释分析的是正确的 由于此时 你在构建 grid search 的时候 传入的算法是 log reg 而 log reg 是 LogisticRegr 的对象 但是创建 LogisticRegr 是并不需要参数 degree 所以 这里会报错

    2026年3月26日
    2
  • idea 2020 license server 激活码_通用破解码

    idea 2020 license server 激活码_通用破解码,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月17日
    950
  • UpdatePanel控件的使用(实现局部刷新,ajax)

    UpdatePanel控件的使用(实现局部刷新,ajax)ScriptManager和UpdatePanel控件联合使用可以实现页面异步局部更新的效果。其中的UpdatePanel就是设置页面中异步局部更新区域,它必须依赖于ScriptManager存在,因为ScriptManger控件提供了客户端脚本生成与管理UpdatePanel的功能。几个重要的属性:   ScriptManager控件的EnablePartialRendering属

    2022年7月23日
    12
  • js二维数组排序

    js二维数组排序nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp vararr nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp name zopp age 0 nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp name gpp age 18 nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp name yjj age 8 nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp functioncomp p

    2026年3月17日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号