MySQL45讲 第十一讲 怎么给字符串字段加索引?

文章目录

  • MySQL45讲 第十一讲 怎么给字符串字段加索引?
    • 一、引言
    • 二、前缀索引
      • (一)概念与创建方式
      • (二)数据结构与存储差异
      • (三)确定前缀长度的方法
    • 三、前缀索引对覆盖索引的影响
    • 四、其他索引创建方式
      • (一)倒序存储
      • (二)Hash 字段
    • 五、总结

MySQL45讲 第十一讲 怎么给字符串字段加索引?


一、引言

在数据库应用中,字符串字段的索引创建至关重要。第十一讲将以支持邮箱登录的系统用户表为例,深入探讨字符串字段索引的创建方式及其优缺点。

例子:现在维护一个支持邮箱登录的系统,用户表是这么定义

mysql> create table SUser(
ID bigint unsigned primary key,
email varchar(64),
...
)engine=innodb;

二、前缀索引

(一)概念与创建方式

  1. MySQL 支持前缀索引,可定义字符串的一部分作为索引。若创建索引语句不指定前缀长度,索引将包含整个字符串。例如,在用户表SUseremail字段上创建索引:

    • alter table SUser add index index1(email)创建的index1索引包含整个字符串

    • alter table SUser add index index2(email(6))创建的index2索引仅取每个记录email字段的前 6 个字节。

      在这里插入图片描述

(二)数据结构与存储差异

  1. index1index2为例,index2因只取前 6 个字节,占用空间更小。但使用前缀索引可能增加额外记录扫描次数。

    如查询语句select id,name,email from SUser where email='zhangssxyz@xxx.com'

    • 使用index1只需回主键索引取一次数据,系统认为扫描一行;

    • 使用index2则需回主键索引取 4 次数据,扫描 4 行。不过,**若将index2定义为email(7),则可只扫描一行。**说明定义合适长度的前缀索引可在节省空间的同时控制查询成本。

(三)确定前缀长度的方法

  1. 建立索引时关注区分度,可通过统计索引上不同值的数量判断前缀长度

    首先用select count(distinct email) as L from SUser;算出列上不同值的数量:再用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;查看不同长度前缀的情况。设定可接受的损失比例(如 5%),在返回结果中找出不小于L * 95%的值,若L6L7满足,可选择前缀长度为6。

三、前缀索引对覆盖索引的影响

  1. 对于语句select id,email from SUser where email='zhangssxyz@xxx.com';,若使用index1(整个字符串索引结构),可利用覆盖索引直接返回结果;若使用index2email(6)索引结构),需回主键索引判断email字段值。即使将index2定义为email(18),InnoDB 仍会回主键索引检查,因为系统不确定前缀索引是否截断完整信息。这表明使用前缀索引可能无法享受覆盖索引对查询性能的优化,选择时需考虑此因素。

四、其他索引创建方式

(一)倒序存储

  1. 当字符串前缀区分度不够时,如身份证号(前 6 位地址码在同一县可能相同),可使用倒序存储。存储时将身份证号倒过来,查询时使用mysql> select field_list from t where id_card = reverse('input_id_card_string');。由于身份证号最后 6 位无重复逻辑,可能提供足够区分度,但需用count(distinct)验证。倒序存储在主键索引上不消耗额外存储空间,每次读写需调用reverse函数,会增加扫描行数。

(二)Hash 字段

  1. 另一种方式是创建hash字段。在表上新增整数字段保存身份证校验码,并在该字段创建索引。插入记录时用crc32()函数计算校验码填入。查询语句为mysql> select field_list from t where id_card_crc=crc32('input_id_card_string') and id_card='input_id_card'。这种方式索引长度变为 4 字节,占用空间小。hash字段方式每次写读需调用crc32()函数,查询性能相对稳定,平均扫描行数接近 1,但存在校验码冲突概率,且不支持范围查询。

五、总结

字符串字段创建索引有多种方式:

  • 直接创建完整索引占用空间大;
  • 创建前缀索引节省空间但增加查询扫描次数且不能使用覆盖索引;
  • 倒序存储再创建前缀索引可解决字符串本身前缀区分度不够问题;
  • 创建hash字段索引查询性能稳定,但有额外存储和计算消耗,且不支持范围扫描。

实际应用中需根据业务字段特点选择合适方式。

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

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

相关文章

STM32CUBEIDE FreeRTOS操作教程(八):queues多队列

STM32CUBEIDE FreeRTOS操作教程(八):queues多队列 STM32CUBE开发环境集成了STM32 HAL库进行FreeRTOS配置和开发的组件,不需要用户自己进行FreeRTOS的移植。这里介绍最简化的用户操作类应用教程。以STM32F401RCT6开发板为例&#…

2.Python解释器

python解释器程序,用来翻译python代码,并提交给计算机执行。 上一篇博客就是安装了python解释器程序 写一个python文件,在文件中写入多行代码并执行: 进入python后,输入exit()命令退出

JAVA笔记 | ResponseBodyEmitter等异步流式接口快速学习

先简单记录下简单使用跟测试,后续再补充具体,最近有用到,简单来说就是后端(服务端)编写个发射器,实现一次请求,一直向前端客户端发射数据,直到发射器执行完毕,模拟ai一句一句回复的效果 Respon…

Liunx:文件fd、重定向、管道

文件fd: 操作系统运行中一定存在着许多被打开的文件,这些文件需要被管理。一个进程会打开若干个文件。一个文件如果在操作系统中被打开,那么必须给该文件创建一个文件对象,包含被打开文件的各种属性。那么进程与文件的关系就变成…

linux笔记(DNS)

一、概念 DNS(Domain Name System)DNS 是一种分布式网络目录服务,主要用于将人类易于记忆的域名(如 www.example.com)转换为计算机可识别的 IP 地址(如 192.168.1.1)。它就像是互联网的电话簿&a…

优衣库在淘宝平台的全方位竞品分析与店铺表现研究:市场定位与竞争策略透视

优衣库品牌在淘宝平台的全方位竞品与店铺表现分析 一、品牌商品分析 1.商品列表与分类分析(数据来源:关键词商品搜索接口;获取时间:2024.08.30) 商品类别分布柱状图: 根据关键词商品搜索接口获取到的优衣…

RocketMQ 自动注入消费者

目录 前言一、情景介绍二、问题分析三、代码实现 前言 之前接到一个需求,我们项目的技术负责人希望通过配置的形式,在项目启动的时候自动根据配置生成对应的消费者 觉得还有点意思,随即记录一下~ 一、情景介绍 比如我这里有一个消费者 Mes…

数据结构(C语言版)(第2版) 课后习题答案 李冬梅

数据结构(C语言版)(第2版) 第1章 绪论 1.简述下列概念:数据、数据元素、数据项、数据对象、数据结构、逻辑结构、存储结构、抽象数据类型。 答案: 数据:是客观事物的符号表示,指所有能输入到计算机中并被计算机程序处理的符号的总称。如数学计算中用到的整数和实数…

Vue 自定义icon组件封装SVG图标

通过自定义子组件CustomIcon.vue使用SVG图标&#xff0c;相比iconfont下载文件、重新替换更节省时间。 子组件包括&#xff1a; 1. Icons.vue 存放所有SVG图标的path 2. CustomIcon.vue 通过icon的id索引对应的图标 使用的时候需要将 <Icons></Icons> 引到使用的…

吴恩达深度学习笔记:卷积神经网络(Foundations of Convolutional Neural Networks)4.9-4.10

目录 第四门课 卷积神经网络&#xff08;Convolutional Neural Networks&#xff09;第四周 特殊应用&#xff1a;人脸识别和神经风格转换&#xff08;Special applications: Face recognition &Neural style transfer&#xff09;4.9 内容代价函数&#xff08;Content cos…

界面控件DevExpress WPF中文教程:Data Grid——卡片视图设置

DevExpress WPF拥有120个控件和库&#xff0c;将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序&#xff0c;这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 无论是Office办公软件…

LLM训练”中的“分布式训练并行技术;分布式训练并行技术

目录 “LLM训练”中的“分布式训练并行技术” 分布式训练并行技术 数据并行 流水线并行:按阶段(stage)进行切分 张量并行 序列并行 多维混合并行 自动并行 MOE并行 重要的分布式AI框架 “LLM训练”中的“分布式训练并行技术” 随着深度学习技术的不断发展,特别是…

Ubuntu开启FTP与SSH服务

在配置开发环境时&#xff0c;这两个配置感觉是最有用的&#xff0c;开启FTP服务可以将远程linux上的文件映射到Windows上&#xff0c;不管是使用虚拟机还是嵌入式linux设备&#xff0c;特别在开发写代码的时候&#xff0c;映射到Windows上使用VS code打开编写比在linux上编写舒…

虚拟现实技术及其在教育领域的应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 虚拟现实技术及其在教育领域的应用 虚拟现实技术及其在教育领域的应用 虚拟现实技术及其在教育领域的应用 引言 虚拟现实技术概述…

搜维尔科技:Varjo XR-4在教育科研领域应用

医学教育与培训&#xff1a; • 解剖学教学&#xff1a;传统的解剖学教学依赖于教科书、图片或实体标本&#xff0c;学生对于人体结构的空间关系理解存在一定难度。而使用Varjo头显&#xff0c;学生可以沉浸在虚拟的人体解剖环境中&#xff0c;全方位、多角度地观察人体的各个…

Java 源码中的 Unicode 逃逸问题,别被注释给骗了

背景 看了一段项目源码&#xff0c;定义了一个 List 对象&#xff0c;往该列表对象 add 的代码前面有注释符号&#xff0c;但是程序运行时列表中却存在对象&#xff0c;为什么呢&#xff1f;仔细看了一下&#xff0c;注释符号和 add 代码之间有一个特殊符号 \u000d&#xff0c…

基于python的机器学习(一)—— 基础知识(Scikit-learn安装)

目录 一、机器学习基础 1.1 机器学习概述 1.2 监督学习、无监督学习和强化学习 1.3 聚类、分类、回归、标注 1.3.1 聚类 1.3.2 分类 1.3.3 回归 1.3.4 标注 1.4 机器学习、人工智能和数据挖掘 1.5 机器学习的三个要素 二、Scikit-learn 机器学习库 2.1 Scikit-lea…

React 入门课程 - 使用CDN编程React

1. 第一个React 注意&#xff1a;在vscode里&#xff0c;使用Live Server来运行html文件。 index.html <html><head><link rel"stylesheet" href"index.css"><script crossorigin src"https://unpkg.com/react17/umd/react.de…

23isctf

where_is_the_flag 1.打开环境&#xff0c;上面有一句话木马&#xff0c;直接蚁剑上 flag1&#xff1a;蚁剑连接上就可以直接看见&#xff0c;FLAG1:Yunxi{d0c0 flag2:在根目录下就有 797a-4697- flag3&#xff1a; 在主页面有一个start.sh里面有提示信息 4dfe-9b48-50ff…

传统RAG流程;密集检索器,稀疏检索器:中文的M3E

目录 传统RAG流程 相似性搜索中:神经网络的密集检索器,稀疏检索器 密集检索器 BGE系列模型 text-embedding-ada-002模型 M3E模型 稀疏检索器 示例一:基于TF-IDF的稀疏检索器 示例二:基于BM25的稀疏检索器 稀疏检索器的特点与优势 传统RAG流程 相似性搜索中:神经…