首页 > 其他分享 >【IT老齐047】避坑UUID主键

【IT老齐047】避坑UUID主键

时间:2024-03-18 14:46:32浏览次数:18  
标签:UUID ID 老齐 047 磁盘 数据 主键

【IT老齐047】避坑UUID主键

场景

财政部金财工程平台在代理行日终结算时,经常出现磁盘的IO异常,导致经常出现高延迟

对比发现在大量数据新增时磁盘IO居高不下,多次测试后发现是UUID主键在搞鬼

UUID

  • 基于时间的UUID
    • 能保证不同设备UUID是唯一的
    • 在同一设备上生成UUID可能重复
  • DCE安全的UUID
    • DCE(身份验证和安全服务)
    • 涉及侵犯用户隐私
    • 有损时间戳导致精度丢失
  • 基于命名空间的UUID (MD5、SH1)
    • 在相同的命名空间下可能会出现UUID冲突
  • 基于随机数的UUID
    • 完全随机生成,会存在极小概率重复的情况
    • 与外部环境无关,不涉及环境信息
    • 生成内容无序无规律
    • 目前的主流做法

UUID主键

  • 优点
    • 全局唯一
    • 信息安全
  • 缺点
    • 索引效率低
    • 新增效率低

页分裂

UUID是无序的,当UUID可能在索引中间某一页插入数据时
新增记录所在的数据页已满,数据库需要申请一个新的数据页存储数据。这种现象被称为“页分裂”。
页分裂确保后一个数据页中的所有的 ID 值一定比数据页中的 ID 值大在大并发环境环境下增加了磁盘IO的压力,无序ID才是罪魁祸首

查找插入点时,顺序id数据会插入到最大id的页,这页往往也存在于cache中。而随机ID还需要重新去找对应页,这些页可能是冷数据,存在于磁盘上,查找需要把这部分数据交换到内存,所以造成磁盘io高.

解决方法

  • 改为有序的数字主键生成策略(美团Leaf / 推特Snowflake)
  • 13位时间戳(毫秒)+一位域(默认是0)+2位自增值(redis基于当前毫秒时间戳的incr生成,超出99睡眠1毫秒递归调用自己获取)

标签:UUID,ID,老齐,047,磁盘,数据,主键
From: https://www.cnblogs.com/faetbwac/p/18080351

相关文章

  • 【IT老齐046】RabbitMQ队列解决消息积压问题
    【IT老齐046】RabbitMQ队列解决消息积压问题场景每天上午10点,全国2万多名客户经理集中录入上一日JK单据到BorrowSale系统,峰值能达到500单/s。但信审系统任务重,最多只支持到60单/s,每日会导致大量消息积压解决方案工作队列RabbitMQ改为工作队列模式,将消息送给9个信审系统实......
  • 【IT老齐048】Kafka高性能原因
    【IT老齐048】Kafka高性能磁盘顺序读写定期批量删除指定数据页缓存Kafka避免使用JVM,直接使用操作系统的页缓存特性提高处理速度,进而避免了JVMGC带来的性能损耗。Kafka采用字节紧密存储,避免产生对象,这样可以进一步提高空间利用率零拷贝批量操作......
  • 代码随想录算法训练营第十天|LeetCode 20.有效的括号、1047.删除字符串中的所有相邻重
    20.有效的括号题目链接:https://leetcode.cn/problems/valid-parentheses/description/解题思路:题目转化:三种类型的括号,需要做匹配匹配规则是:左右括号的类型要匹配、数量要一致,而且要按照顺序匹配例子是:“()”、“(){}[]”、“(([]))”条件转化:按照顺序匹配:......
  • 代码随想录算法训练营第十一天| 20. 有效的括号 1047. 删除字符串中的所有相邻重复
    20.有效的括号https://leetcode.cn/problems/valid-parentheses/description/publicbooleanisValid(Strings){if(s==null)returntrue;Stack<Character>stack=newStack<>();for(inti=0;i<s.length();i++){......
  • mybatis oracle数据库批量插入数据,忽略主键重复
    dao方法IntegerinsertPackagesNew(@Param("list")List<InfCollectpackage>list);mapper.xml<insertid="insertPackagesNew"parameterType="java.util.List">MERGEINTOINF_COLLECTPACKAGEAUSING(&......
  • pandas笔记(二)-- 从不订购的顾客 (数据表连接,主键与外键)
    题目描述找出所有从不点任何东西的顾客,以任意顺序返回结果测试用例输入Customerstable:idname1Joe2Henry3Sam4MaxOrderstable:idcustomerId1321输出CustomersHenryMax解析数据表连接的问题核心在于连接......
  • 自增长主键回显实现,批量数据插入
    1packagecom.atsyc.api.preparedstatement;23importorg.junit.Test;45importjava.sql.*;67publicclassPSOtherPart{8/*9*TODO:10*t_user插入一条数据,并且获取数据库自增长的主键11*使用总结:12*......
  • P3047 [USACO12FEB] Nearby Cows G
    原题链接题解核心技巧:两次搜索第一次搜索:搜索出\(f[now][i]\)以\(now\)为根节点的子树且距离根节点恰好为\(i\)的节点的个数搜索完了之后,把范围\(k\)以内的累加第二次搜索:由于整棵树的根节点的\(f\)等于整棵树里距离不大于\(k\)的节点个数,即已经符合题目要求......
  • 代码随想录 第11天 | 20. 有效的括号 ● 1047. 删除字符串中的所有相邻重复项 ● 150.
    Leetcode:20.有效的括号-力扣(LeetCode)思路:就是用栈存左右括号,都为0就说明true,不为零说明有没有匹配成功的括号,是false,思路没有问题,时间超时了,还得用C++...,java更好的思路如下:如果是左括号,push右括号,如果是右括号,判断是否与栈顶元素匹配,JAVA//deque.isEmpty();这个方法返回......
  • 代码随想录算法训练营day11 | leetcode 20. 有效的括号、1047. 删除字符串中的所有相
    目录题目链接:20.有效的括号-简单题目链接:1047.删除字符串中的所有相邻重复项-简单题目链接:150.逆波兰表达式求值-中等题目链接:20.有效的括号-简单题目描述:给定一个只包括'(',')','{','}','[',']'的字符串s,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右......