浅谈前缀索引

news2024/11/19 15:25:31

一.什么是前缀索引

所谓前缀索引说白了就是对字符串或前n个字符建立索引

二.为什么选择前缀索引

一般来说使用前缀索引,可能都是因为整个字段的数据量太大,没有必要针对整个字段建立索引,前缀索引仅仅是选择一个字段的前n个字符作为索引,这样一方面可以节约索引空间,另一方面则可以提高索引效率,当然很明显,这种方式也会降低索引的选择性。这里又涉及到一个概念,索引选择性

三.什么是索引选择性

它是指不重复的索引值和数据表的记录总数的比值,取值范围在 [0,1] 之间。索引的选择性越高则查询效率越高,因为选择性高的索引可以让 MySQL 在查找时过滤掉更多的行。
那是不是选择性越高的索引越好呢?也不全是,索引选择性最高为 1,唯一索引选择性肯定为1,搜索的时候就能直接通过搜索条件定位到具体一行记录,这个时候虽然性能最好,但是也是最费空间的,而前缀恰恰就是希望能够在索引的性能和空间之间找到一个平衡,我们希望能够选择足够长的前缀以保证较高的选择性,但是又希望索引不要太过于占用存储空间。

四.前缀索引的n应该怎么确定

那么我们该如何选择一个合适的索引选择性呢?索引前缀应该足够长,以便前缀索引的选择性接近于索引的整个列,即前缀的基数应该接近于完整列的基数

五.验证一下

我们来看一个实际的问题,下图的表中假设有5kw数据,除主键外,我们没有其他的索引
在这里插入图片描述

现在我们有一个需求:根据手机号查询用户id,那前缀索引应该怎么玩呢或者说怎么确定这个n

1.首先我们可以通过如下 SQL 得到全列选择性 (这里结果为1,即没有重复的值)
sql:SELECT COUNT(DISTINCT phone) / COUNT(*) FROM test
在这里插入图片描述
2.调试我们的n(索引选择性)

sql: SELECT COUNT(DISTINCT LEFT(phone, N)) / COUNT(*) FROM test;

这里的思路就是不停的追加n的值,获取到最近全列选择性(也就是1),但是N最小的值
在这里插入图片描述

其实我们基于表中的数据也可以看出,前三位已经可以达到唯一确定数据的作用了(现实中数据量大,需要调试)
在这里插入图片描述

确定好前缀索引的n接下来就可以去创建并使用了
sql: alter table test add index phone_index(phone(3));
在这里插入图片描述
执行一个查询sql
在这里插入图片描述

结合执行计划,我们来分析一下执行过程

  1. 从 phone_index 索引中找到第一个值为 134的记录(phone 的前3个字符)
  2. 由于 phone_index 是二级索引,叶子结点保存的是主键值,所以此时拿到了主键 id
  3. 拿着主键 id 去回表,在主键索引上找到 id 所在行的完整记录,返回给 server 层。
  4. server 层判断其 phone 是不是 13499213214(所以执行计划的Extra 为 Using where)
    1.如果不是,这行记录丢弃。
    2.如果是,将该记录加入结果集
  5. 索引叶子结点上数据之间是有单向链表维系的,所以接着第一步查找的结果,继续向后读取下一条记录,然后重复 2、3、4 步,直到在 phone_index 上取到的值不为 “134” 时,循环结束。

如果我们建立了前缀索引的选择性为 1,那么就不需要第 5 步了因为满足条件的值就一条,如果前缀索引选择性小于 1,就需要第五步。

从上流程中,可以合理选择前缀索引长度能够既节省空间,又提高搜索效率。

六:前缀索引的缺点

凡事都有二面行,那么前缀索引真的完美么,当然不是
我们再看一个sql

在这里插入图片描述

说好的索引覆盖呢?(注意看 Extra 是 Using where)
前缀索引中,B+Tree 里保存的就不是完整的 phone 字段的值,必须要回表才能拿到需要的数据。所以,用了前缀索引,就拿不到数据的完成值,必须回表,也用不了覆盖索引了

七. 总结

  1. 前缀索引是一种能使索引更小,更快的有效办法,但另一方面也有其缺点:mysql无法使用其前缀索引做ORDER BY和GROUP BY,也无法使用前缀索引做覆盖扫描
  2. 要明确使用前缀索引的目的与优势:大大节约索引空间,从而提高索引效率
  3. 真正的难点在于:要选择足够长的前缀以保证较高的选择性

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/29427.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux运维工程师的操作规范

,Linux运维工程师的操作规范从事运维有一段时间了,遇到过各式各样的问题,数据丢失,网站挂马,误删数据库文件,黑客攻击等各类问题。 今天简单整理一下,分享给各位小伙伴。 一、线上操作规范 1、…

你可见过如此细致的延时任务详解

概述 延时任务相信大家都不陌生,在现实的业务中应用场景可以说是比比皆是。例如订单下单 15 分钟未支付直接取消,外卖超时自动赔付等等。这些情况下,我们该怎么设计我们的服务的实现呢? 笨一点的方法自然是定时任务去数据库进行轮…

华为机试 - 滑动窗口最大和

目录 题目描述 输入描述 输出描述 用例 题目解析 算法源码 题目描述 有一个N个整数的数组,和一个长度为M的窗口,窗口从数组内的第一个数开始滑动直到窗口不能滑动为止, 每次窗口滑动产生一个窗口和(窗口内所有数的和&…

常用的框架技术-09 Spring Security Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录1.Spring Security简介1.1 Spring Security概述1.2 Spring Security历史发展1.3 产品的对比1.3.1 Spring Security1.3.2 Shiro1.4 Spring Security 核心类1.4.1 Auth…

qemu 线程 vhost

[rootlocalhost cloud_images]# lsmod | grep vhost_net vhost_net 262144 0 vhost 262144 1 vhost_net tap 262144 1 vhost_net tun 262144 2 vhost_net [rootlocalhost cloud_images]#vhost-net网卡的…

[附源码]SSM计算机毕业设计基于实时定位的超市配送业务管理JAVA

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

低碳世界杂志低碳世界杂志社低碳世界编辑部2022年第7期目录

节能环保 挥发性有机物的全厂控制措施 董少军; 1-3 《低碳世界》投稿:cnqikantg126.com 佛山市市政排水管网通沟污泥处理处置工艺设计 张红; 4-6 “双碳”背景下海岸带地区适应气候变化评估与对策研究 王鸿浩;邬乐雅;吴晓晨;张丽佳;黄婧蓼琦;胡斐…

【毕业设计】基于情感分析的网络舆情热点分析系统

文章目录0 前言1 课题背景2 数据处理3 文本情感分析3.1 情感分析-词库搭建3.2 文本情感分析实现3.3 建立情感倾向性分析模型4 数据可视化工具4.1 django框架介绍4.2 ECharts5 Django使用echarts进行可视化展示5.1 修改setting.py连接mysql数据库5.2 导入数据5.3 使用echarts可视…

Java编程实战9:统计只差一个字符的子串数目

目录统计只差一个字符的子串数目题目示例 1示例 2示例 3示例 4提示解答解题思路完整代码统计只差一个字符的子串数目 题目 给你两个字符串 s 和 t ,请你找出 s 中的非空子串的数目,这些子串满足替换 一个不同字符 以后,是 t 串的子串。换言…

实验1:Arduino的nRF24L01单向收发实验

实验结果: 发送端发送“Hello World”,发送成功打印1 接收端接收到“Hello World”,在串口中打印出“Hello World” OK,直接讲代码 因为我用的Arduino和nRF24L01 是用扩展板连接的,而我的嵌入式硬件开发,也就是AD实在不擅长,就不解释了 其中(9,10)CE,CSN 那么我…

通关算法题之 ⌈数组⌋ 下

二分搜索 704. 二分查找 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。 输入: nums [-1,0,3,5,9,12], target 9 输出…

【后台技术】异步编程指北,问题和重点

导语:同步、异步,并发、并行、串行,这些名词在我们的开发中会经常遇到,这里对异步编程做一个详细的归纳总结,希望可以对这方面的开发有一些帮助。 内容大纲: 1、几个名词的概念 多任务的时候,…

jmeter压力测试报告

出版社智能智造测试报告 (二期版本) 2022年11月 目 录 1. 测试背景 1.1. 项目背景 1.2. 测试目的 1.3. 测试时间 1.4. 测试资源 1.5. 参考资料 2. 测试范围 3. 性能需求指标 3.1. 业界指标 4. 测试工具 5. 测试环境 5.1. 阿里云测试环境软…

搭建Gitlab

Gitlab是目前被广泛使用的基于git的开源代码管理平台, 基于Ruby on Rails构建, 主要针对软件开发过程中产生的代码和文档进行管理 一、搭建gitlab服务器,统一管理软件项目 第一步: 创建一个4G内存的虚拟机,否则很容易启动不了,报…

(附源码)计算机毕业设计Java“华商转转”平台的设计和实现

项目运行 环境配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: Springboot mybatis Maven Vue 等等组成,B/…

python常用进制转换

整数之间转换 # 1. 10 -> 16 hex(number)# 2. 10 -> 2 bin(number)# 3. 10 -> 8 oct(number)# 4. x进制 -> 10 int(Union[str, bytes, bytearray],basex) ------------------ print(int("0x16", base16)) // 22字符串转整数 # 10进制 val int(10) pri…

SPP-学习笔记

Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition SPP提出的原因 1、现有的深度卷积神经网络(spp出现之前的)需要固定大小的输入图像(例如224224)。往往需要对图片裁剪或者resize,导致图片信息损失或者产生几何畸变。这样可能会损…

奥比中光亮相全球1024开发者节,与科大讯飞达成战略合作

作者 | 奥比中光 编辑 | 3D视觉开发者社区 11月17日-23日,第五届世界声博会暨2022科大讯飞全球1024开发者节在安徽合肥举办,奥比中光作为3D视觉感知头部企业参展,并与科大讯飞达成战略合作,共同赋能3D视觉行业应用开发。 本次参…

如何利用现代工具来管理多项目

多项目管理是如今现代企业管理时常常遇到的一个难题。不同于单项目管理,多个项目同时进行管理要复杂得很多。而单纯的手工管理方式已经满足不了多管理的复杂需求,项目负责人想要保障在预定的时间内,又快又好地完成整体项目,便需要…

工厂模式解耦-交由spring来完成

上面两个小节一直在谈论解耦,从入门的多例到升级的单例BeanFactory工厂类是我们自己手工写的。 BeanFactory主要做了3件事: 1.读取配置文件(可以是properties或xml类型的文件,示例中用的是properties文件) 2.获取类…