Mysql可以使用字符串前缀 作为索引 以节约空间。

下面我们以 Java的UUID 生成的 32位(移除UUID中的 中划线)字符串 来做一下 测试。

表结构:

CREATE TABLE `test_uuid` (

`id` int(10) unsigned NOT NULL AUTO_INCREMENT,

`uuid` varchar(36) DEFAULT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT DEFAULT CHARSET=utf8

UUID生成的方式(不考虑replaceAll的替换效率):

UUID.randomUUID().toString().replaceAll("-", "")

查询 不同长度的前缀索引效率(索引的选择性,即不重复的索引值)的SQL:

select

count(DISTINCT uuid) / count(*) as total,

count(DISTINCT LEFT(uuid,5)) / count(*) as five,

count(DISTINCT LEFT(uuid,6)) / count(*) as six,

count(DISTINCT LEFT(uuid,7)) / count(*) as seven,

count(DISTINCT LEFT(uuid,8)) / count(*) as eight,

count(DISTINCT LEFT(uuid,9)) / count(*) as nine,

count(DISTINCT LEFT(uuid,10)) / count(*) as ten

from test_uuid;

下面看一下测试数据及结果:

20W数据

40W

60W

80W

100W

200W

300W

500W

1000W

2000W

随着数据量的增多,同样长度的前缀索引选择性 逐渐降低。

前7位 在2000W数据的时候损失了 0.04, 也就是说 每100 条数据, 会有4条与其他96条数据 有重复。

前9位 在2000W数据的时候损失了 0.0001 ,也就是说 每10000 条数据,会有1 条与 其他 9999条有重复。

前10位 在2000W数据的时候 选择行 依然为1 (前10位没有任何重复的)。

大家可以算一下 26的10次方,大概是 141 万 亿。

当然,以上数据 我只做过一次, 其他测试数据应该与 本次测试数据 稍有不同,但可以肯定的是:不会相差很多。

所以,当业务需要使用 uuid 作为 业务唯一的key时, 可以评估业务数据量,选择合适长度的前缀索引。

前缀索引的选择性 越接近 总长度索引的选择性 时,说明已经可以了。

但是,前缀索引有一些缺点:

1. Mysql 前缀索引 不支持 order by 和 group by 查询。

2 Mysql 前缀索引 不能作为 覆盖索引使用。

各位大佬有问题,欢迎交流。

mysql uuid 索引_Mysql使用Java UUID作为唯一值时使用前缀索引测试相关推荐

  1. mysql is null走索引_mysql中IS NULL、IS NOT NULL不能走索引?

    不知道是啥原因也不知道啥时候, 江湖上流传着这么一个说法 mysql查询条件包含IS NULL.IS NOT NULL.!=.like %* .like %*%,不能使用索引查询,只能使用全表扫描. ...

  2. mysql 主从 索引_Mysql繁忙主从库在线修改表结构与添加索引问题

    本帖最后由 jan_1985 于 2014-1-15 13:28 编辑 Mysql繁忙主从库在线修改表结构与添加索引问题 一直以来,生产情况下都有修改索引和修改字段的需求,但是对锁表引起的访问不便是会 ...

  3. java读mysql时间类型_MySql与Java的时间类型

    MySql与Java的时间类型 MySql的时间类型有          Java中与之对应的时间类型 date                                           j ...

  4. MySql 一条普通的查询语句 你知道如何优雅的使用 前缀索引、索引下推优化查询速度吗?

    在码农的世界里,优美的应用体验,来源于程序员对细节的处理以及自我要求的境界,年轻人也是忙忙碌碌的码农中一员,每天.每周,都会留下一些脚印,就是这些创作的内容,有一种执着,就是不知为什么,如果你迷茫,不 ...

  5. es java 删除索引_使用java中的elasticSearch 2.3.3按索引名称和类型删除索引

    我在java中有一个项目,我使用弹性搜索2.3.3索引数据.索引有两种类型. 我的索引文档看起来像: { "took": 10,"timed_out": fal ...

  6. 获取mysql可行方法_Mysql学习Java实现获得MySQL数据库中所有表的记录总数可行方法...

    <Mysql学习Java实现获得MySQL数据库中所有表的记录总数可行方法>要点: 本文介绍了Mysql学习Java实现获得MySQL数据库中所有表的记录总数可行方法,希望对您有用.如果有 ...

  7. mysql 批量加索引_mysql优化:按期删数据 + 批量insert + 字符串加索引为何很傻

    嗯,犯了一个很低级的错误,最近暴露出来了.html 背景:mysql 1. 内部平台,接口间断性无返回,查询日志注意到失败时,接口耗时达到4000+(正常状态:100+ms)git 2. 增长日志打点 ...

  8. mysql in优化_MySQL的一次优化记录 (IN子查询和索引优化)

    这两天实习项目遇到一个网页加载巨慢的问题(10多秒),然后定位到是一个MySQL查询特别慢的语句引起的: SELECT * FROM ( SELECT DISTINCT t.vc_date, t.c_ ...

  9. mysql timestamp 默认_MySQL数据库TIMESTAMP怎么设置默认值 | 学步园

    MySQL数据库TIMESTAMP设置默认值新手技术人员对他感到很陌生,不知道该怎么设置.下面学步园小编来讲解下MySQL数据库TIMESTAMP怎么设置默认值? MySQL数据库TIMESTAMP怎 ...

最新文章

  1. 实验23:测试泛型依赖注入★
  2. python内置对象的实现_Python 内置对象的实现
  3. 7个GIF动图帮你瞬间理解三角函数
  4. 计算机专业教学工作小结,计算机专业教学的工作总结
  5. python内嵌函数和闭包与java 匿名内部类_Lambda表达式与匿名内部类的联系和区别...
  6. mac卸载python3.8_如何使用Homebrew在Mac上默认设置Python3.8?
  7. MFC学习--文本框
  8. H5案例分析和场景应用
  9. 干货|java缓存技术详解
  10. Java简易聊天室YYchat
  11. angularjs实现复选框赋值传参提交表单
  12. 目标检测(四)——xml快速上手(可完整实现)
  13. 地图API公交线路查询
  14. Cisco:CCNA专业英文词汇(1)
  15. python代码画樱花-如何用Python画出一颗漂亮的樱花
  16. vue实现商城列表渲染
  17. 豪沃轻abs12v电是什么系统_小汽车显示abs是什么问题,ABS系统介绍
  18. 大批量查询邮政国际物流并查看更新量为2的单号
  19. 密码学:流加密法与块加密法
  20. 2021-2022 CSU C语言期末考试二

热门文章

  1. c++与unreal 的uc脚本交互
  2. F6-预编译编译安装
  3. java时间转化类,一小时前,刚刚一个月前
  4. web开发中的跨域问题
  5. 你真的会用 VS Code 的 Ctrl、Shift和Alt吗?高效易用的快捷键:多光标、跳转引用等轻松搞定
  6. 【编译原理笔记06】语法分析,移入-归约分析:自底向上的分析,LR(0)分析法,LR(0)分析表的构建(基于自动机)
  7. 【数据结构笔记27】树习题:完全二叉搜索树(Complete Binary Search Tree)
  8. 设计模式 总揽 通过这篇随笔可以访问所需要了解的设计模式
  9. unity3d人物跳_Unity3D研究院之角色控制器组件研究(二十二)
  10. c#excel导入mysql_(转)C# Excel导入Access数据库的源码