当前位置: 首页 > news >正文

专业摄影网站推荐广州做seo整站优化公司

专业摄影网站推荐,广州做seo整站优化公司,微商分销模式方案,做网站如何使用数据库前言#xff1a;在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究竟有什么坏处#xff1f;本篇博客我们就来分析这个问题,探讨一下内部的…前言在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究竟有什么坏处本篇博客我们就来分析这个问题,探讨一下内部的原因。一mysql和程序实例1.1要说明这个问题,我们首先来建立三张表,分别是user_auto_key,user_uuid,user_random_key,分别表示自动增长的主键,uuid作为主键,随机key作为主键,其它我们完全保持不变.根据控制变量法,我们只把每个表的主键使用不同的策略生成,而其他的字段完全一样然后测试一下表的插入速度和查询速度注这里的随机key其实是指用雪花算法算出来的前后不连续不重复*无规律*的id:一串18位长度的long值id自动生成表 用户uuid表 随机主键表 1.2光有理论不行,直接上程序,使用spring的jdbcTemplate来实现增查测试 技术框架springbootjdbcTemplatejunithutool,程序的原理就是连接自己的测试数据库,然后在相同的环境下写入同等数量的数据来分析一下insert插入的时间来进行综合其效率为了做到最真实的效果,所有的数据采用随机生成比如名字、邮箱、地址都是随机生成程序已上传自gitee,地址在文底。​ package com.wyq.mysqldemo; import cn.hutool.core.collection.CollectionUtil; import com.wyq.mysqldemo.databaseobject.UserKeyAuto; import com.wyq.mysqldemo.databaseobject.UserKeyRandom; import com.wyq.mysqldemo.databaseobject.UserKeyUUID; import com.wyq.mysqldemo.diffkeytest.AutoKeyTableService; import com.wyq.mysqldemo.diffkeytest.RandomKeyTableService; import com.wyq.mysqldemo.diffkeytest.UUIDKeyTableService; import com.wyq.mysqldemo.util.JdbcTemplateService; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.util.StopWatch; import java.util.List; SpringBootTest class MysqlDemoApplicationTests { ​Autowiredprivate JdbcTemplateService jdbcTemplateService; ​Autowiredprivate AutoKeyTableService autoKeyTableService; ​Autowiredprivate UUIDKeyTableService uuidKeyTableService; ​Autowiredprivate RandomKeyTableService randomKeyTableService; ​ ​Testvoid testDBTime() { ​StopWatch stopwatch new StopWatch(执行sql时间消耗); ​ ​/*** auto_increment key任务*/final String insertSql INSERT INTO user_key_auto(user_id,user_name,sex,address,city,email,state) VALUES(?,?,?,?,?,?,?); ​ListUserKeyAuto insertData autoKeyTableService.getInsertData();stopwatch.start(自动生成key表任务开始);long start1 System.currentTimeMillis();if (CollectionUtil.isNotEmpty(insertData)) {boolean insertResult jdbcTemplateService.insert(insertSql, insertData, false);System.out.println(insertResult);}long end1 System.currentTimeMillis();System.out.println(auto key消耗的时间: (end1 - start1)); ​stopwatch.stop(); ​ ​/*** uudID的key*/final String insertSql2 INSERT INTO user_uuid(id,user_id,user_name,sex,address,city,email,state) VALUES(?,?,?,?,?,?,?,?); ​ListUserKeyUUID insertData2 uuidKeyTableService.getInsertData();stopwatch.start(UUID的key表任务开始);long begin System.currentTimeMillis();if (CollectionUtil.isNotEmpty(insertData)) {boolean insertResult jdbcTemplateService.insert(insertSql2, insertData2, true);System.out.println(insertResult);}long over System.currentTimeMillis();System.out.println(UUID key消耗的时间: (over - begin)); ​stopwatch.stop(); ​ ​/*** 随机的long值key*/final String insertSql3 INSERT INTO user_random_key(id,user_id,user_name,sex,address,city,email,state) VALUES(?,?,?,?,?,?,?,?);ListUserKeyRandom insertData3 randomKeyTableService.getInsertData();stopwatch.start(随机的long值key表任务开始);Long start System.currentTimeMillis();if (CollectionUtil.isNotEmpty(insertData)) {boolean insertResult jdbcTemplateService.insert(insertSql3, insertData3, true);System.out.println(insertResult);}Long end System.currentTimeMillis();System.out.println(随机key任务消耗时间: (end - start));stopwatch.stop(); ​ ​String result stopwatch.prettyPrint();System.out.println(result);}1.3程序写入结果user_key_auto写入结果 user_random_key写入结果 user_uuid表写入结果 1.4效率测试结果 在已有数据量为130W的时候我们再来测试一下插入10w数据看看会有什么结果可以看出在数据量100W左右的时候,uuid的插入效率垫底并且在后序增加了130W的数据uudi的时间又直线下降。时间占用量总体可以打出的效率排名为auto_keyrandom_keyuuid,uuid的效率最低在数据量较大的情况下效率直线下滑。那么为什么会出现这样的现象呢带着疑问,我们来探讨一下这个问题 二:使用uuid和自增id的索引结构对比2.1使用自增id的内部结构 自增的主键的值是顺序的,所以Innodb把每一条记录都存储在一条记录的后面。当达到页面的最大填充因子时候(innodb默认的最大填充因子是页大小的15/16,会留出1/16的空间留作以后的 修改) ①下一条记录就会写入新的页中一旦数据按照这种顺序的方式加载主键页就会近乎于顺序的记录填满提升了页面的最大填充率不会有页的浪费 ②新插入的行一定会在原有的最大数据行下一行,mysql定位和寻址很快不会为计算新行的位置而做出额外的消耗 ③减少了页分裂和碎片的产生2.2:使用uuid的索引内部结构 因为uuid相对顺序的自增id来说是毫无规律可言的,新行的值不一定要比之前的主键的值要大,所以innodb无法做到总是把新行插入到索引的最后,而是需要为新行寻找新的合适的位置从而来分配新的空间。这个过程需要做很多额外的操作数据的毫无顺序会导致数据分布散乱将会导致以下的问题①写入的目标页很可能已经刷新到磁盘上并且从缓存上移除或者还没有被加载到缓存中innodb在插入之前不得不先找到并从磁盘读取目标页到内存中这将导致大量的随机IO②因为写入是乱序的,innodb不得不频繁的做页分裂操作,以便为新的行分配空间,页分裂导致移动大量的数据一次插入最少需要修改三个页以上③由于频繁的页分裂页会变得稀疏并被不规则的填充最终会导致数据会有碎片在把随机值uuid和雪花id载入到聚簇索引(innodb默认的索引类型)以后,有时候会需要做一次OPTIMEIZE TABLE来重建表并优化页的填充这将又需要一定的时间消耗。结论使用innodb应该尽可能的按主键的自增顺序插入并且尽可能使用单调的增加的聚簇键的值来插入新行2.3使用自增id的缺点 那么使用自增的id就完全没有坏处了吗并不是自增id也会存在以下几点问题①别人一旦爬取你的数据库,就可以根据数据库的自增id获取到你的业务增长信息很容易分析出你的经营情况②对于高并发的负载innodb在按主键进行插入的时候会造成明显的锁争用主键的上界会成为争抢的热点因为所有的插入都发生在这里并发插入会导致间隙锁竞争③Auto_Increment锁机制会造成自增锁的抢夺,有一定的性能损失 附Auto_increment的锁争抢问题如果要改善需要调优innodb_autoinc_lock_mode的配置三总结 本篇博客首先从开篇的提出问题,建表到使用jdbcTemplate去测试不同id的生成策略在大数据量的数据插入表现然后分析了id的机制不同在mysql的索引结构以及优缺点深入的解释了为何uuid和随机不重复id在数据插入中的性能损耗详细的解释了这个问题。在实际的开发中还是根据mysql的官方推荐最好使用自增idmysql博大精深内部还有很多值得优化的点需要我们学习。
http://www.pierceye.com/news/575781/

相关文章:

  • 宿迁公司企业网站建设《网站基础建设-首保》
  • 做全屏式网站尺寸是多大国外虚拟主机 两个网站
  • 黑龙江建设网站招聘广西住房和城乡建设厅培训中心官方网站
  • 做网站客户最关心的是什么制作网页原型的目的
  • 电子商务网站建设工具河南安阳吧
  • 南通网站建设公司哪个好肯德基的网站建设
  • 高端大气网站源码wordpress做双语网站
  • 360网站推广东莞凤岗
  • 公司网站高端网站建设赣州做网站多少钱
  • dw做网站怎么发布建设银行官方网站登录入口
  • 怎样查看网站建设时间免费外贸自建网站
  • 网站备案注销原因网站建设入账
  • 番禺做网站哪家好wordpress 样式引用
  • 网站研发进度表下载网站建设亿码酷适合5
  • 对网站域名销户怎么做舆情监控都有哪些内容
  • 南宁做网站优化企业网站开发合同
  • 网站做京东联盟公司注册网上核名入口
  • jsp做的零食网站下载一分钟做网站
  • 营销网站竞品分析报告上海平面网站
  • 网站建设 邦机票网站制作
  • 网站开发从整体上用vps刷网站流量要怎么做
  • 搭建一个网站 优帮云网站无法访问的原因
  • 卖印花图案设计网站北京管庄网站建设公司
  • 北京石景山网站建设外贸网络推广经验
  • 好看的网站源码手机网站在线生成
  • 响应式网站设计的主页网站定制合同
  • 做查询网站有哪些杭州市建设部门网站
  • 免费做外贸的网站制作logo网站
  • 网站改版意义服务营销案例100例
  • 服装厂做1688网站效果好不好做lol数据的网站有哪些