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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • CAN协议 J1939「建议收藏」

    CAN协议 J1939「建议收藏」转自:http://blog.sina.com.cn/s/blog_bf97bd7e0102wl2y.html这几天在公司看了SAE推行的J1939标准(SAE:美国汽车工程协会),这里整理下学习要点,主要包含以下几个协议:物理层SAEJ1939-11(未看)数据链路层SAEJ1939-21网络层SAEJ1939-31(未看)应用层SAEJ1939-…

    2022年5月26日
    61
  • nginx负载均衡算法

    nginx负载均衡算法转自https://www.cnblogs.com/kakatadage/p/9994228.html配置方式NGINX配置负载均衡主要是在nginx.conf文件中里upstream模块1、u

    2022年7月3日
    23
  • C# ACCESS数据库操作类

    这个是针对ACCESS数据库操作的类,同样也是从SQLHELPER提取而来,分页程序的调用可以参考MSSQL那个类的调用,差不多的,只是提取所有记录的数量的时候有多一个参数,这个需要注意一下!推荐:

    2021年12月27日
    40
  • 【HTML基础】CSS样式表「建议收藏」

    【HTML基础】CSS样式表「建议收藏」1.理解HTML与CSS各自的功能及配合原则;2.掌握HTML与CSS的三种组合方式。

    2022年7月14日
    15
  • linux切换java版本_java_home environment variable

    linux切换java版本_java_home environment variable© 版权声明:本文为博主原创文章,转载请注明出处本文根据官方文档加上自己的理解,仅供参考官方文档:https://docs.spring.io/spring-security/

    2022年8月4日
    6
  • Matlab矩阵复制扩充

    考虑这个问题:定义一个简单的行向量a    如何复制10行呢?即:    同理,对于一个列向量,如何复制10列呢?  关键函数1:repmat(A,m,n):将向量/矩阵在垂直方向复制m次,在水平方向复制n次。      再举一个例子,对于a=[12;34]:         垂直方向复制3次,水平方向复制2次,

    2022年4月8日
    60

发表回复

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

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