MySQL字符串索引创建方案

news2024/10/6 16:16:36

字符串字段添加索引

MySQL是支持前缀索引的,也就是说,你可以定义字符串的一部分作为索引。默认地,如果你创建索引的语句不指定前端长度,那么索引就会包含整个字符串。

# 包含整个字符串
alter table table_name add index index1(column);
# 对每个记录都只取前6个字节
alter table table_name add index index2(column(6));

根据字节创建索引,占用空间小,但是可能会导致扫描次数增多。

举个栗子

假设有车辆表vehicle

create table vehicle
(
    id           varchar(32) not null
        primary key,
    brand        varchar(10) not null comment '车辆品牌',
    plate_number varchar(10) not null comment '车牌号'
)
    comment '车辆信息表';
 alter table vehicle add index brand_index(brand(3));  
 
 INSERT INTO `daily_test`.`vehicle`(`id`, `brand`, `plate_number`) VALUES ('1', '比亚迪-汉DMI', '鲁B.11111');
INSERT INTO `daily_test`.`vehicle`(`id`, `brand`, `plate_number`) VALUES ('2', '比亚迪-秦DMI', '鲁B.22222');
INSERT INTO `daily_test`.`vehicle`(`id`, `brand`, `plate_number`) VALUES ('3', '比亚迪-宋DMI', '鲁B.33333');

现在有根据车辆品牌查询车辆的需求,那么我们需要执行SQL:

select id,brand from vehicle where brand = '比亚迪-汉DMI';

brand字段使用字节索引brand_index时,查询到数据流程:

  1. brand_index索引树查询到值是比亚迪的记录,找到第一个值id1。
  2. 到主键上查询到主键值是id1的数据行,判断brand字段的值是否为比亚迪-汉DMI,如果是,把本行数据加入结果集,继续执行步骤一、步骤二。如果不是,丢弃本行,找下一个。
  3. 直到在索引树上取到的值不是比亚迪时,循环结束。

当使用全字段索引时,根据索引树查到符合where条件的id,根据id去查询数据所在的行即可,无需再判断。

实测

请添加图片描述
在这里插入图片描述

可以看到,当使用前缀索引时,扫描行数为3,当使用字段索引时,扫描行数为1。

使用前缀索引时,需要定义好长度,否则虽然节省了空间,但是可能导致查询成本增加,影响性能。

如何选择合适的前缀索引长度

我们在建立索引时关注的是区分度,区分度越高越好。因为区分度越高,意味着重复的键值越少。因此,我们可以通过统计索引上有多少个不同的值来判断要使用多长的前缀。

如使用一下语句选择前缀索引的长度:

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;

创建前缀索引前,需要预定可接受的损失比例,使用Ln/总区分度计算损失比例,选择可达到最小损失比例的前缀长度即可。

字符串索引的四种方式

  1. 直接创建完整索引,这样可能比较占用空间(应用最广泛);
  2. 创建前缀索引,节省空间,但会增加查询扫描次数,并且不能使用覆盖索引;
  3. 倒序存储,再创建前缀索引,用于绕过字符串本身前缀的区分度不够的问题;
  4. 创建 hash 字段索引,查询性能稳定,有额外的存储和计算消耗,跟第三种方式一样,都不支持范围扫描。

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

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

相关文章

liteos连接器脚本隐藏的指针问题

一,数据拷贝引起的指针问题 大家想一下,一个指针指向的内存地址处的数据,假设拷贝到了另外一个地方,那么这个时候我们的指针还是指向原来的位置,那么就会导致问题。为什么提出这个问题呢?因为我们前面讲到了liteos的data段的拷贝,那么对于data段的访问的指针是不是也要…

供应Pyrene-PEG-Biotin,Biotin-PEG-Pyrene,芘丁酸-聚乙二醇-生物素

一:产品描述 1、名称 英文:Pyrene-PEG-Biotin,Biotin-PEG-Pyrene 中文:芘丁酸-乙二醇-生物素 2、CAS编号:N/A 3、所属分类:Biotin PEG Pyrene PEG 4、分子量:可定制,Pyrene-PE…

知识点15--k8s应用入门

本篇我们用上一篇知识点搭建的k8s集群,认识k8s的入门级使用方法,无法完全体现出k8s的性能,注意不是高级的应用。顺便说一点k8s的操作都依靠于命令,甚至是修改配置文件也提供了编辑命令,命令很像js的选择器,…

视频截图修复方法是什么?这些方法和步骤教会你

在日常的生活中,你是否会遇到过这样的情况:每当在观看一些视频的时候,看到自己喜欢的剧情片段时,就会想要将其截取下来留作收藏,但有时候可能会出现截出来的图片画面是模糊的,这该怎么办呢?其实…

MODBUS-TCP协议

modbus-tcp顾名思义是基于TCP网络连接的MODBUS协议。 和RS485总线不同,TCP协议是通过设备的IP地址和端口来寻址。 modbus-tcp的默认端口号是502,设备端作为TCP服务器监听502端口,主机为TCP客户端主动去连接外设。与RS485一样,主机…

LVI-SAM源码解析(一):论文阅读

1. 摘要 LVI-SAM是一种基于平滑化和映射实现的激光雷达-视觉-IMU紧耦合SLAM方法,能够实现高精度、高鲁棒性地实时状态估计和地图构建。 LVI-SAM建立于包含两个子系统的因子图上:视觉-IMU子系统(VIS)和激光-IMU子系统&#xff…

CMake中target_compile_features的使用

CMake中的target_compile_features命令用向target添加预期的编译器功能(compiler features)&#xff0c;其格式如下&#xff1a; target_compile_features(<target> <PRIVATE|PUBLIC|INTERFACE> <feature> [...]) 指定在编译给定的<target>时所需的编…

SpringBoot+Vue+kkFileView实现文档管理(文档上传、下载、在线预览)

场景 SpringBootVueOpenOffice实现文档管理(文档上传、下载、在线预览)&#xff1a; SpringBootVueOpenOffice实现文档管理(文档上传、下载、在线预览)_霸道流氓气质的博客-CSDN博客_vue openoffice 上面在使用OpenOffice实现doc、excel、ppt等文档的管理和预览。 除此之外…

linux下安装nginx

linux下安装nginx 注&#xff1a;此处需要先安装vmware&#xff0c;下载Centos8等工具&#xff0c;配置好一个虚拟机。 1、下载nginx的linux版本 2、上传至搭建好的linux环境上。 3、解压nginx压缩包 4、安装nginx编译需要的相关 安装 nginx 需要先将官网下载的源码进行编译…

Spring源码深度解析十五:@Aspect方式的AOP中篇 - getAdvicesAndAdvisorsForBean

一、前言 文章目录&#xff1a;Spring源码深度解析&#xff1a;文章目录 在上篇中我们概述了Aop 实现的逻辑&#xff0c;但是由于篇幅原因&#xff0c;我们将一部分内容拆成了中篇和下篇内容。本篇即中篇&#xff0c;内容主要是讲述 在 Bean创建过程中Aop 挑选适用于当前Bean…

html简洁风格的个人博客网站模板(源码)

文章目录1.设计来源1.1 博客首界面1.2 个人简介界面1.3 日常记录界面1.4 文章列表界面1.5 文章信息界面2.结构源码2.1 目录结构2.2 源代码源码下载作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/details/128288153 html简洁风格…

qtday1:2、重新手动实现对象树模型

代码段加注释 #include <iostream> #include<list> using namespace std; class A { public:list<A *> child; //创建一个链表 public:A(A *parent nullptr){if(parent !nullptr) //说明有父组件{parent->child.push_back(this); //有父组件就将该…

数商云SRM供应商系统询比价采购业务流程介绍,重塑汽修企业核心竞争力

众所周知&#xff0c;采购供应是关系企业经营效益的重要工作。在汽修行业&#xff0c;由于汽车配件的车型规格繁多&#xff0c;技术业务性强&#xff0c;各种类商品采购过程的艰难性、销售状况的复杂性等等&#xff0c;汽配采购往往容易陷入种种困境&#xff0c;极大降低汽修企…

Qt-Web混合开发-QWebEngineView加载网页最小示例(1)

Qt-Web混合开发-QWebEngineView加载网页最小示例&#x1f4a5; 文章目录Qt-Web混合开发-QWebEngineView加载网页最小示例&#x1f4a5;1、概述&#x1f4af;2、实现效果&#x1f4a6;3、实现功能&#x1f4ac;4、关键代码&#x1f4a4;5、源代码&#x1f648;更多精彩内容&…

【20天快速掌握Python】day01-Python入门

1、什么是Python&#xff1f; Python是一门解释型的编程语言&#xff0c;而且是现在世界上最流行的编程语言之一。 2、Python优缺点 优点 简单&#xff1a;Python是一种代表简单主义思想的语言。阅读一个良好的Python程序就感觉像是在读英语一样&#xff0c;尽管这个英语的要…

driftingblues靶机(0ok编码)

环境准备 靶机链接&#xff1a;百度网盘 请输入提取码 提取码&#xff1a;oylc 虚拟机网络链接模式&#xff1a;桥接模式 攻击机系统&#xff1a;kali linux 2021.1 信息收集 1.探测目标靶机ip arp-scan -l 2.探测目标靶机开放端口和服务情况 nmap -A -sV -p- 192.168.…

SpringCloud之微服务环境搭建

目录 1、微服务介绍 1.1.微服务架构介绍 1.2.微服务架构的常见问题 1.3.微服务架构的常见解决方案 1.3.1.ServiceComb ​ 1.3.2.SpringCloud 1.3.3.SpringCloud Alibaba 2、微服务环境搭建 2.1案例准备 技术选项&#xff1a; 模块设计&#xff1a; …

pyqt5打包后的exe文件在网吧windoes7系统运行报错问题

方案一 用录屏软件录个视频&#xff0c;然后用播放软件打开逐帧查看&#xff0c;找到报错原因&#xff0c;一般是某个包导入错误&#xff0c;重新安装下对应的包。(忒麻烦) 方案二 生成的exe文件你们执行的话&#xff0c;cmd黑框肯定会一闪而过&#xff0c;但是没有关系&…

[附源码]Nodejs计算机毕业设计基于Java的在线点餐系统Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置&#xff1a; Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分…

使用 VADER 对股票新闻进行情绪分析

什么是情感分析&#xff1f; 提示&#xff1a;情感分析 定义&#xff1a; 情感分析或意见挖掘是自然语言处理 (NLP)的一个子领域&#xff0c;它试图在给定文本中识别和提取意见。情感分析的目的是根据文本中主观性的计算处理来衡量说话者/作者的态度、情绪、评价、态度和情绪…