iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >一文搞懂什么是MySQL前缀索引
  • 151
分享到

一文搞懂什么是MySQL前缀索引

2024-04-02 19:04:59 151人浏览 独家记忆
摘要

目录一、什么是前缀索引二、为什么要用前缀索引三、怎么创建前缀索引四、使用前缀索引需要注意的事项五、小结一、什么是前缀索引 所谓前缀索引,说白了就是对文本的前几个字符建立索引(具体是几个字符在建立索引时去指定),比如以产品

一、什么是前缀索引

所谓前缀索引,说白了就是对文本的前几个字符建立索引(具体是几个字符在建立索引时去指定),比如以产品名称的前 10 位来建索引,这样建立起来的索引更小,查询效率更快!

有点类似于 oracle 中对字段使用 Left 函数来建立函数索引,只不过 Mysql 的这个前缀索引在查询时是内部自动完成匹配的,并不需要使用 Left 函数。

二、为什么要用前缀索引

可能有的同学会发出疑问,为什么不对整个字段建立索引呢?

一般来说,当某个字段的数据量太大,而且查询又非常的频繁时,使用前缀索引能有效的减小索引文件的大小,让每个索引页可以保存更多的索引值,从而提高了索引查询的速度。

比如,客户店铺名称,有的名称很长,有的很短,如果完全按照全覆盖来建索引,索引的存储空间可能会非常的大,有的表如果索引创建的很多,甚至会出现索引存储的空间都比数据表的存储空间大很多,因此对于这种文本很长的字段,我们可以截取前几个字符来建索引,在一定程度上,既能满足数据的查询效率要求,又能节省索引存储空间。

但是另一方面,前缀索引也有它的缺点,mysql 中无法使用前缀索引进行 ORDER BY 和 GROUP BY,也无法用来进行覆盖扫描,当字符串本身可能比较长,而且前几个字符完全相同,这个时候前缀索引的优势已经不明显了,就没有创建前缀索引的必要了。

因此这又回到一个概念,那就是关于索引的选择性

关于数据库表索引的选择性,我会单独开篇来讲解,大家只需要记住一点:索引的选择性越高则查询效率越高,因为选择性高的索引可以让 Mysql 在查找时过滤掉更多的行,数据查询速度更快!

当某个字段内容的前几位区分度很高的时候,这个时候采用前缀索引,可以在查询性能和空间存储方面达到一个很高的性价比

那么问题来了,怎么创建前缀索引呢?

三、怎么创建前缀索引

建立前缀索引的方式,方法很简单,通过如下方式即可创建!

ALTERTABLEtable_nameADDKEY(column_name(prefix_length));

其中prefix_length这个参数,就是前缀长度的意思,通常通过如下方式进行确认,步骤如下:

第一步,先计算某字段全列的区分度。

SELECTCOUNT(DISTINCTcolumn_name)/COUNT(*)FROMtable_name;

第二步,然后再计算前缀长度为多少时和全列的区分度最相似

SELECTCOUNT(DISTINCTLEFT(column_name,prefix_length))/COUNT(*)FROMtable_name;

最后,不断地调整prefix_length的值,直到和全列计算出区分度相近,最相近的那个值,就是我们想要的值。

下面以某个测试表为例,数据体量在 100 万以上,表结构如下!

CREATETABLE`tb_test`(
`id`bigint(20)unsignedNOTNULLAUTO_INCREMENT,
`name`varchar(100)DEFAULTNULL,
PRIMARYKEY(`id`)
)ENGINE=InnoDBAUTO_INCREMENT=1DEFAULTCHARSET=utf8mb4;

一文搞懂什么是MySQL前缀索引

一文搞懂什么是MySQL前缀索引

测试一下正常的带name条件查询,效率如下:

select*fromtb_testwherenamelike'1805.59281427%'

一文搞懂什么是MySQL前缀索引

我们以name字段为例,创建前缀索引,找出最合适的prefix_length值

首先,我们大致计算一下name字段全列的区分度。

一文搞懂什么是MySQL前缀索引

可以看到,结果为 0.9945,也就是说全局不相同的数据率在99.45%这个比例。

下面我们一起来看看,不同的prefix_length值下,对应的数据不重复比例。

prefix_length5,区分度为0.2237

一文搞懂什么是MySQL前缀索引

prefix_length10,区分度为0.9944

一文搞懂什么是MySQL前缀索引

prefix_length11,区分度为0.9945

一文搞懂什么是MySQL前缀索引

通过对比,我们发现当prefix_length11,最接近全局区分度,因此可以为name创建一个长度为11的前缀索引,创建索引语句如下:

altertabletb_testaddkey(name(11));

下面,我们再试试上面那个语句查询!

一文搞懂什么是MySQL前缀索引

创建前缀索引之后,查询效率倍增

四、使用前缀索引需要注意的事项

是不是所有的字段,都适合用前缀索引呢?

答案显然不是,在上文我们也说到了,当某个索引的字符串列很大时,创建的索引也就变得很大,为了减小索引体积,提高索引的扫描速度,使用索引的前部分字符串作为索引值,这样索引占用的空间就会大大减少,并且索引的选择性也不会降低很多,这时前缀索引显现的作用就会非常明显,前缀索引本质是索引查询性能和存储空间的一种平衡。

对于 BLOB 和 TEXT 列进行索引,或者非常长的 VARCHAR 列,就必须使用前缀索引,因为 MySQL 不允许索引它们的全部长度。

但是如果某个字段内容,比如前缀部分相似度很高,此时的前缀索引显现效果就不会很明显,采用覆盖索引效果会更好!

五、小结

好了,本文主要围绕前缀索引做了一次初步的知识讲解,具体数据库表索引的选择性,还需要结合业务实际需求来考虑!

以上就是一文搞懂什么是MySQL前缀索引的详细内容,更多关于MySQL前缀索引的资料请关注我们其它相关文章!

您可能感兴趣的文档:

--结束END--

本文标题: 一文搞懂什么是MySQL前缀索引

本文链接: https://www.lsjlt.com/news/34296.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • mysql前缀索引是什么
    这篇“mysql前缀索引是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“mysql前缀...
    99+
    2023-05-25
    mysql
  • MySQL——图文版搞懂MySQL的索引是什么?
    按数据结构分类可分为:B+tree 索引、 Hash 索引、 Full-text 索引。按物理存储分类可分为:聚簇索引(主键索引)、二级索引(辅助索引)。按字段特性分类可分为:主键索引、普通索引、前缀...
    99+
    2023-10-26
    mysql 数据库
  • 一文搞懂MySQL索引页结构
    目录1.前言2.索引页结构2.1FileHeader2.2PageHeader2.3UserRecords2.4Infimum&Supremum2.5PageDirector...
    99+
    2024-04-02
  • mysql中前缀索引指的是什么
    这篇文章主要为大家展示了“mysql中前缀索引指的是什么”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“mysql中前缀索引指的是什么”这篇文章吧。1、说明有时候需要索引很长的字符列,索引变得又大...
    99+
    2023-06-15
  • 一文简单了解MySQL前缀索引
    当要索引的列字符很多时 索引则会很大且变慢 ( 可以只索引列开始的部分字符串 节约索引空间 从而提高索引效率 ) 原则: 降低重复的索引值 例如现在有一个地区表 areagdpcod...
    99+
    2024-04-02
  • 一文搞懂MySQL索引特性(清晰明了)
    目录为什么要有索引?认识磁盘磁盘的结构磁盘的盘片结构定位扇区mysql与磁盘交互索引的理解测试主键索引索引的原理索引结构是否可以使用其他数据结构聚簇索引 vs 非聚簇索引总结为什么要有索引? MySQL索引的建立对于My...
    99+
    2023-04-10
    mysql索引特性 mysql索引特点 mysql索引使用
  • Mysql索引的最左前缀原则是什么
    这篇文章主要介绍了Mysql索引的最左前缀原则是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Mysql索引的最左前缀原则是什么文章都会有所收获,下面我们一起来看看吧。前言之所以有这个最左前缀索引归根结底是...
    99+
    2023-06-29
  • MySQL的前缀索引有什么作用?
    MySQL的前缀索引有什么作用?(1500字) 导言 在MySQL数据库中,索引是一种提高数据检索效率的重要技术手段。前缀索引是一种特殊类型的索引,它可以在某些情况下有效地减小索引的大...
    99+
    2024-03-14
    mysql 作用 前缀索引 内存占用
  • mysql前缀索引怎么设置
    在mysql中设置前缀索引的方法:1.命令行启动mysql服务;2.登录mysql;3.选择数据库;4.执行“CREATE INDEX '表名' ON products('列名'(13)); ”命令创建前缀索...
    99+
    2024-04-02
  • 一篇文章读懂什么是MySQL索引下推(ICP)
    目录一、简介 二、原理 三、实践 3.1 不使用索引下推 3.2 使用索引下推 四、使用条件 五、相关系统参数 总结一、简介 ICP(Index Condition Pushdow...
    99+
    2024-04-02
  • 一文读懂 MySQL 中的索引
    文章目录 1. 索引概述1.1 索引概述1.2 优点1.3 缺点1.6 常见索引概念1.6.1 聚簇索引1.6.2 二级索引(辅助索引、非聚簇索引)1.6.3 联合索引 1.8 MyISAM索引的原理1.9 MyISAM 与 ...
    99+
    2023-08-16
    mysql android 数据库
  • 怎么理解并掌握mysql索引之前缀索引
    本篇内容主要讲解“怎么理解并掌握mysql索引之前缀索引”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么理解并掌握mysql索引之前缀索引”吧!有时候需要很长...
    99+
    2024-04-02
  • 图文详解Mysql索引的最左前缀原则
    目录前言1. 定义2. 全索引顺序3. 部分索引顺序3.1 正序3.2 乱序4. 模糊索引5. 范围索引总结前言 之所以有这个最左前缀索引 归根结底是mysql的数据库结构 B+树 ...
    99+
    2024-04-02
  • 一文弄懂MySQL索引创建原则
    目录一、适合创建索引1、字段的数值有唯一性限制2、频繁作为Where查询条件的字段3、经常Group by和Order by的列4、Update、Delete的w...
    99+
    2024-04-02
  • 一文搞懂Golang 值传递还是引用传递
    目录Go 官方的定义传值和传引用什么是传值(值传递)什么是传引用(引用传递)总结参考资料Go 官方的定义 本部分引用 Go 官方 FAQ 的 “When are func...
    99+
    2023-01-11
    Golang值传递还是引用传递 Golang值传递 go引用传递
  • 一文带你搞懂什么是Nginx服务器
    目录一、Nginx是什么?二、Nginx的反向代理(扩展:正向代理)三、Nginx的负载均衡什么是负载均衡?四、Nginx的动静分离!五、Nginx的安装windows版本下的安装下...
    99+
    2023-05-15
    Nginx Nginx服务器
  • mysql索引文件是什么
    MySQL索引文件是用于快速查找和检索数据库中数据的数据结构,它是在表中的一个或多个列上创建的,以提高查询性能和数据检索速度,包含了索引键值和指向实际数据位置的指针,索引文件通常存储在磁盘上,与表数据文件分开存储。本教程操作系统:Windo...
    99+
    2023-08-02
  • mysql中什么是全文索引
    这篇文章将为大家详细讲解有关mysql中什么是全文索引,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。1、说明MyISAM存储引擎支持全文索引,用于查找文本中的关键词,而不是直接比较是否相等。...
    99+
    2023-06-15
  • MySQL唯一索引指的是什么
    这篇文章给大家分享的是有关MySQL唯一索引指的是什么的内容。小编觉得挺实用的,因此分享给大家做个参考。一起跟随小编过来看看吧。Mysql会在有新纪录插入数据表时,自动检查新纪录的这个字段的值是否已经在某个...
    99+
    2024-04-02
  • 还是搞不懂Anaconda是什么?读这一篇文章就够了
    文章目录 1 Anaconda介绍2 conda介绍3 安装Anaconda4 Anaconda的使用配置Anaconda源 5 创建虚拟环境并使用5.1 创建虚拟环境5.2 查看所有环境...
    99+
    2023-09-01
    python 学习
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作