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使用Java UUID作为唯一值时使用前缀索引测试的更多相关文章

  1. JAVA UUID 生成唯一标识

    Writer:BYSocket(泥沙砖瓦浆木匠) 微博:BYSocket 豆瓣:BYSocket Reprint it anywhere u want 需求 项目在设计表的时候,要处理并发多的一些数据 ...

  2. MySQL查询统计,统计唯一值并分组

    做个笔记 SQLyog客户端访问MySQL服务器 统计数据:次数总数, 次数成功率,对象(obj)总数,对象(obj)成功率 要求:按时间排序和分组 sql语句如下: SELECT a.date AS ...

  3. Java Map 在put值时value值不被覆盖

    一.问题描述 最近在代码开发中遇到一个问题,在往Map中put文件路径值然后把Map放到List中去时,遇到问题是Map的后一个值总是把前一个值覆盖,导致最后Map中只有一个值. 二.解决办法(有如下 ...

  4. JAVA UUID 生成唯一密钥(可随机选择长度)

    /**     * 获得指定数目的UUID      * @param number int 需要获得的UUID数量      * @return String[] UUID数组      */    ...

  5. MySQL三个列组成唯一值查询_开源中国问题练习_20161026

    问题地址:https://www.oschina.net/question/2923955_2202674 按 service_collect_day分类以后,按 app_id,node_id,ser ...

  6. 关于sortedlist 中值的添加,删除,索引测试.

    SortedList 类代表了一系列按照键来排序的键/值对,这些键值对可以通过键和索引来访问. 排序列表是数组和哈希表的组合.它包含一个可使用键或索引访问各项的列表.如果您使用索引访问各项,则它是一个 ...

  7. mysql索引之一:索引基础(B-Tree索引、哈希索引、聚簇索引、全文(Full-text)索引区别)(唯一索引、最左前缀索引、前缀索引、多列索引)

    没有索引时mysql是如何查询到数据的 索引对查询的速度有着至关重要的影响,理解索引也是进行数据库性能调优的起点.考虑如下情况,假设数据库中一个表有10^6条记录,DBMS的页面大小为4K,并存储10 ...

  8. PIE SDK栅格数据唯一值渲染

    1. 功能简介 栅格数据唯一值渲染,是以像元为单位,不同的像元值设置不同的颜色,从而达到唯一值显示的效果. 2. 功能实现说明 2.1. 实现思路及原理说明 第一步 实例化唯一值渲染对象 第二步 初始 ...

  9. MySQL索引之前缀索引和索引选择性

    有时需要索引很长的字符列,它会使索引变大而且变慢.一个策略就是模拟哈希索引.但是有时这也不够好,那? 通常可以索引开始的几个字符,而不是全部值,以节约空间并得到好的性能.这使索引需要的空间变小,但是也 ...

随机推荐

  1. Nginx的简单了解与使用

    一.产生背景 我们日常生活中经常遇到的问题 这是几年前的12306,现在的12306基本上不会出现这样的问题了 上述场景产生的主要 2 大原因:1.巨大流量2.单台服务器资源和能力有限在海量并发的环境 ...

  2. 图像Image类、打印Printing相关

    一.Images 1.概述 Image 类为Bitmap(位图) 和 Metafile(矢量图) 的类提供功能的抽象基类.Image类不能直接创建对象的,但Image.FromFile()返回的是Bi ...

  3. csrf简单明了( 转发)

    https://www.daguanren.cc/post/csrf-introduction.html csrf_token = request.META.get('CSRF_COOKIE') re ...

  4. Python2和Python3中新式类、经典类(旧式类)的区别

    https://www.jianshu.com/p/6f9d99f7ad54 里面最后一张图应该输出   This is from C

  5. java web项目中后台控制层对参数进行自定义验证 类 Pattern

    Pattern pattern = Pattern.compile("/^([1-9]\d+元*|[0]{0,1})$/");//将给定的正则表达式编译到模式中 if(!" ...

  6. Material icons 全图标一览

    Material icons 全图标一览 2018年12月17日 16:52:55 boywcx 阅读数 3090   版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog. ...

  7. springboot+mvc+mbatisplus

    https://www.cnblogs.com/scode2/p/8718553.html

  8. poj 2762

    Tarjan + TopsortTarjan 缩点Topsort 判断 Topsort 判断:在DAG中若初始状态下存在多于1个入度为0的点则说明这些 入度为0的点之间不会有路径可达若不存在入度为0的 ...

  9. [Luogu] 1600

    https://www.luogu.org/problemnew/show/P1600 nlogn竟然T了 #include <iostream> #include <cstdio& ...

  10. 「ARC103D」Robot Arms「构造」

    题意 给定\(n\)个点,你需要找到一个合适的\(m\)和\(d_1,d_2,...,d_m\),使得从原点出发每次向四个方向的某一个走\(d_i\)个单位,最终到达\((x_t, y_t)\).输出 ...