mysql如何使用前缀索引_MySQL的前缀索引你是如何使用的[通俗易懂]

mysql如何使用前缀索引_MySQL的前缀索引你是如何使用的[通俗易懂]灵魂3连问:什么是前缀索引?前缀索引也叫局部索引,比如给身份证的前10位添加索引,类似这种给某列部分信息添加索引的方式叫做前缀索引。为什么要用前缀索引?前缀索引能有效减小索引文件的大小,让每个索引页可以保存更多的索引值,从而提高了索引查询的速度。但前缀索引也有它的缺点,不能在orderby或者groupby中触发前缀索引,也不能把它们用于覆盖索引。什么情况下适合使用前缀索引?当字符…

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

灵魂3连问:

什么是前缀索引?

前缀索引也叫局部索引,比如给身份证的前 10 位添加索引,类似这种给某列部分信息添加索引的方式叫做前缀索引。

为什么要用前缀索引?

前缀索引能有效减小索引文件的大小,让每个索引页可以保存更多的索引值,从而提高了索引查询的速度。但前缀索引也有它的缺点,不能在 order by 或者 group by 中触发前缀索引,也不能把它们用于覆盖索引。

什么情况下适合使用前缀索引?

当字符串本身可能比较长,而且前几个字符就开始不相同,适合使用前缀索引;相反情况下不适合使用前缀索引,比如,整个字段的长度为 20,索引选择性为 0.9,而我们对前 10 个字符建立前缀索引其选择性也只有 0.5,那么我们需要继续加大前缀字符的长度,但是这个时候前缀索引的优势已经不明显,就没有创建前缀索引的必要了。

举例说明:

当要索引的列字符很多时 索引则会很大且变慢

( 可以只索引列开始的部分字符串 节约索引空间 从而提高索引效率 )

原则: 降低重复的索引值

例如现在有一个地区表

areagdpcode

chinaShanghai

100

aaa

chinaDalian

200

bbb

usaNewYork

300

ccc

chinaFuxin

400

ddd

chinaBeijing

500

eee

发现 area 字段很多都是以 china 开头的

那么如果以前1-5位字符做前缀索引就会出现大量索引值重复的情况

索引值重复性越低 查询效率也就越高

前缀索引测试

format,png

200万 测试数据

在无任何索引的情况下随便查询一条

SELECT * FROM x_test WHERE x_name = ‘1892008.205824857823401.800099203178258.8904820949682635656.62526521254’;

查询时间:2.253s

添加前缀索引 ( 以第一位字符创建前缀索引 )

alter table x_test add index(x_name(1))

再次查询相同sql语句

SELECT * FROM x_test WHERE x_name = ‘1892008.205824857823401.800099203178258.8904820949682635656.62526521254’;

查询时间:3.291s

当使用第一位字符创建前缀索引后 貌似查询的时间更长了

因为只第一位字符而言索引值的重读性太大了

200万条数据全以数字开头那么平均20万条的数据都是相同的索引值

重新建立前缀索引 这次以前4位字符来创建

alter table x_test add index(x_name(4));

再次查询相同sql语句

SELECT * FROM x_test WHERE x_name = ‘1892008.205824857823401.800099203178258.8904820949682635656.62526521254’;

查询时间:0.703s

这次以前4位创建索引 大大减少了索引值的重复性 查询速度从3秒提升到0.7秒

200万条数据都以数字开头 而0-9排列组合7位则可达到千万种组合

也就是以前7位来做索引则不会出现重复索引值的情况了

alter table x_test add index(x_name(7));

再次查询相同sql语句

SELECT * FROM x_test WHERE x_name = ‘1892008.205824857823401.800099203178258.8904820949682635656.62526521254’;

查询时间:0.014s ( 首次执行无缓存状态下 )

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

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

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Response.ContentType 网页输出word excel 的格式

    Response.ContentType 网页输出word excel 的格式不同的ContentType会影响客户端所看到的效果.默认的ContentType为text/html也就是网页格式.代码如:显示的为网页,而则会显示html原代码.以下为一些常用的ContentTypeGIFimagesJPEGimagesTIFFimagesMICROSOFTWORDdocument

    2022年7月19日
  • Sublime Text3 编译运行java程序

    Sublime Text3 编译运行java程序SublimeText3编译运行java程序一、必须的准备工作1.计算机上成功安装好javaJDK,并且设置好环境变量。2.计算机上安装的有SublimeTtext3。二、配置SublimeTtext31.找到SublimeTtext3的安装目录下的“Packages”文件夹2.在“Packages”文件夹中找到Java.sublime-packag…

    2022年7月27日
  • pycharm2021.9 激活码(JetBrains全家桶)[通俗易懂]

    (pycharm2021.9 激活码)JetBrains旗下有多款编译器工具(如:IntelliJ、WebStorm、PyCharm等)在各编程领域几乎都占据了垄断地位。建立在开源IntelliJ平台之上,过去15年以来,JetBrains一直在不断发展和完善这个平台。这个平台可以针对您的开发工作流进行微调并且能够提供…

    2022年3月26日
  • FEC算法_粒子群算法

    FEC算法_粒子群算法基于IP的语音和视频通话业务为了实时性,一般都是采用UDP进行传输,基站无线一般配置UM模式的RLC承载,因此丢包是不可避免的,在小区信号的边沿则丢包率会更高;为了通话的实时性,一般不会采用接收端发现丢包了然后通知发送端重传的机制,因为这个在应用层的丢包检测和通知发送端重传是非常耗时的。引入前向纠错(FEC)机制是解决实时通话业务丢包的一个很好的机制,FEC的原理就是在发送端发送数据包时插入冗余包…

    2022年8月11日
  • 字符串常量池 运行时常量池_常量池中的字符串是对象吗

    字符串常量池 运行时常量池_常量池中的字符串是对象吗详细介绍了字符串常量池以及其产生的相关问题,并对String类相关操作和String类中的intern()方法进行了详细解析。

    2022年7月28日
  • 《JavaScript 模式》读书笔记(7)— 设计模式2

    这一篇我们主要来学习装饰者模式、策略模式以及外观模式。其中装饰者模式稍微复杂一点,大家认真阅读,要自己动手去实现一下哦。四、装饰者模式在装饰者模式中,可以在运行时动态添加附加功能到对象中。当处理静

    2022年3月25日

发表回复

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

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