有时候需要索引很长的字符列,这会让索引变得大且慢。其中有一种策略是通过自定义哈希索引的方式来模拟哈希索引,但是这样会存在一定的局限性。通常来讲我们可以采用前缀索引的方式,这样可以大大节约索引空间,从而提高索引效率。但是与此同时,这也会一定程度上的降低索引的选择性。

索引的选择性是指,不重复的索引值(也称为基数,cardinality)和数据表的记录总数(#T)的比值,范围从1/#T到1之间。索引的选择性越高则查询效率越高,因为选择性高的索引可以让MySQL在查找时过滤掉更多的行。当然显而易见,唯一索引的选择性是1,这是最好的索引选择性,性能也是最好的。

因此我们要采用前缀索引的关键则是,对于前缀索引的长度的选择,以保证其较高的选择性,但同时又不能太长(有违选择前缀索引的初衷)。总而言之,前缀应该足够长,以使得前缀索引的选择性接近于索引整个列。换句话说,前缀的"基数"应该接近于完整列的"基数"。

假设我们现在有一个city城市表,其中包含了city字段表示城市名称。

city表

现在需要为该字段添加前缀索引,接下来演示一下如何选取最佳前缀索引长度的方法。

计算完整列的选择性

通过观察我们能够发现,完整列的选择性为1。

那么通常来说,在这个例子当中,我们所选取的前缀的选择性能够接近1,基本上就可以用了。可以在一个查询中针对不同前缀长度进行计算,这对于大表非常有用。下面将展示如何在同一个查询当中计算不同前缀长度的选择性:

计算不同前缀长度的选择性

通过观察我们可以看出,当前缀长度达到3时,其选择性便与完整列的选择性相同均为1,那么粗略的来说,我们可以认为在当前数据的背景条件下,前缀索引长度选取为3是最佳的。

以上便演示了在创建前缀索引时,如何确定最佳前缀索引长度的过程,但是仅供理解,不具备实战意义。

接下来补充说明一下关于具体选取前缀索引长度当中的"陷阱":

首先来分析,当我们通过上述的方法依次的得到了多个不同长度前缀的选择性,那么接下来我们需要做的事情便是从中选取出最合适的长度,既要满足与完整列的选择性非常接近,又要满足前缀长度不能过长。在这个模棱两可的抉择点,有时我们需要注意这种问题,由于在上述的方法当中,我们仅仅看到的是平均情况下的选择性,并未看到最坏情况下的选择性,我们在最终确定前缀长度时需要考虑到最坏情况下的选择性。这是由于当数据分布很不均匀的情况下,可能就会出现问题。

上面的描述可能有些抽象,这里再次简单的描述一下陷阱出现的关键原因,即:当我们分析计算得出的前缀索引选项性时只是以全局、平均的角度来分析该选择性,而并未考虑到极端情况下的问题。举个栗子,比如在一张表格当中,我们完整列的选择性为0.319,通过分析我们得到前缀长度为6和7情况下的选择性依次为:sel6=0.312,sel7=0.313,那么我们通过简单的对该数据进行分析,考虑到存储代价,可能会选取前缀索引长度为6作为我们最终的前缀索引长度。但是会存在这样一种情况,当前缀长度为6时,其不足的选择性正是由于极端数据的情况所导致的,而这种情况只会影响少部分前缀查询性能问题,并不会影响总体的查询性能问题。对于这种特殊情况,也应该作为我们考虑的因素。

那么我们应该如何判断有无极端情况的问题呢?答案当然是有的,我们可以通过以下办法来参考判断:

比对参考有无极端数据情况

若通过比对后发现,并无明显数据分布极其不均匀现象,那么则说明平均选择性对于实际数据情况具备较强的参考性。

如何选取最佳前缀索引长度相关推荐

  1. 创建前缀索引时,如何确认“最佳长度”

    当某个字段想要对其创建索引,但是它的长度可能又特别长时,可以考虑前缀索引. 1. 简单信息查询 查询前缀索引的最小/大长度,以及确定生产上数据量大不大,大概有个心理准备.(比如当前字段的最大长度为11 ...

  2. 技术分享 | MySQL 索引长度限制的案例

    作者:刘晨 网名 bisal ,具有十年以上的应用运维工作经验,目前主要从事数据库应用研发能力提升方面的工作,Oracle ACE ,拥有 Oracle OCM & OCP .EXIN Dev ...

  3. MySQL字符串前缀索引详解

    MySQL字符串前缀索引详解 1. 前缀索引与全部索引概念 2. 前缀索引与全部索引数据结构 3. 前缀索引与全部索引引执行流程 4. 前缀索引长度如何取舍 5. 前缀索引对覆盖索引的影响 6. 其他 ...

  4. mysql索引 钱缀_【mysql索引】之前缀索引-Go语言中文社区

    第零步:简单说一说 有时候需要索引很长的字符(例如BLOB,TEXT,或者很长的VARCHAR),这样会使得索引又大又慢. 改良方法有:1.改用哈希索引(这里不讲).2.使用字符串的前几个字符作为索引 ...

  5. MySQL的前缀索引及Oracle的类似实现

    MySQL有一个很有意思的索引类型,叫做前缀索引,它可以给某个文本字段的前面部分单独做索引,从而降低索引的大小. 其实,Oracle也有类似的实现,对于文本,它可以通过substr的函数索引,实现同样 ...

  6. Mysql 索引长度限制

    在设置 utf8mb4 字段的字符长度时,可能会抛出一个异常:"Specified key was too long; max key length is 1000 bytes". ...

  7. mysql前缀索引 默认长度_如何确定前缀索引的长度?

    为什么需要前缀索引 问题 我们在对一张表里的某个字段或者多个字段建立索引的时候,是否遇到过这个问题. Specified key 'uniq_code' was too long; max key l ...

  8. 前缀索引及前缀截取长度的判断标准

    前缀索引 语法:index _name(field_name(n)) : 使用字段值的前n个字符建立索引,不指定默认是使用全部内容建立索引. 关键:前缀的区分度高. 前缀截取长度的判断选择 可以利用如 ...

  9. mysql索引 钱缀_mysql字符串前缀索引

    比如,这两个在 email 字段上创建索引的语句: mysql> alter table SUser add index index1(email); 或 mysql> alter tab ...

  10. MySQL-索引优化篇(1)_安装演示库 [前缀索引、联合索引、覆盖索引] explain参数

    文章目录 生猛干货 官方文档 安装演示数据库sakila 索引优化策略 索引列上不能使用表达式或者函数 前缀索引和索引列的选择性 前缀索引的创建 索引列的选择性 前缀索引的优缺点 联合索引 如何选择索 ...

最新文章

  1. 2162112375 Week04-面向对象设计与继承
  2. 《PhoneGap精粹:构建跨平台的移动App》——1.10节PhoneGap资源
  3. 6 redhat 查看rtc时间_甜甜老师的DB Fun圈第2讲:GaussDB 100 OLTP 单机在RHEL7.6上的安装...
  4. Nginx安装成Windows服务
  5. 创建springmvc配置
  6. SpringAMQP--WorkQueue模型
  7. 算法【二分查找】(数组)
  8. ASP.NET MVC中在 @RenderBody() 或者 @Html.Partial()中需要使用引入外部js,css
  9. JDBC最基本CRUD操作工具类
  10. 将ProudCity建立为开放组织
  11. python 去掉tab_Python使用crontab模块设置和清除定时任务操作详解
  12. 1.5_insert_sort_插入排序
  13. executor-cores参数并未对vcores生效的原因分析
  14. ListenalbeFuture的使用总结
  15. hierbernate 关闭缓存设置_CDN与其他层面缓存
  16. 手机微信开发上传图片到服务器,微信开发之通过微信接口上传图片到本地服务器...
  17. SQLite 3导入导出成txt或csv操作
  18. matlab simulink电感,一文教你快速学会在matlab的simulink中调用C语言进行仿真
  19. T-SQL简介及基本语法
  20. 蓝桥杯 Python 练习题 数列排序

热门文章

  1. 查看文件的SHA256校验值
  2. 对于幸福不是悖论的证明,在现代对于幸福探寻
  3. 计算机课玩游戏检讨书,上微机课玩游戏检讨书.doc
  4. pythongui编程星期的中英文对照_编写一个程序,根据用户输入的一个英文字符翻译成相应的中文日期,如输入“M”返回“星期一”。...
  5. ios10下的通知更新
  6. hp打印机被识别为了usb大容量存储
  7. 【html】网页常用分享代码大全(前端必备)
  8. 线性系统实验:化学方程式配平 与 天体轨道参数估计
  9. 4个让你相见恨晚的电脑操作技巧
  10. workgroup无法访问。您可能没有权限使用网络资源……(解决方案)