生活工程体验信仰哲学精神
投稿投诉
精神世界
探索历史
哲学文学
艺术价值
信仰创造
境界审美
体验技术
技能工具
工程信息
医学生产
生活运用
操作能力

分库分表索引设计二级索引全局索引的最佳设计实践

11月11日 飞凤谷投稿
  主键选择
  对主键来说,要保证在所有分片中都唯一,它本质上就是一个全局唯一的索引。如果用大部分同学喜欢的自增作为主键,就会发现存在很大的问题。
  因为自增并不能在插入前就获得值,而是要通过填NULL值,然后再通过函数lastinsertid()获得自增的值。所以,如果在每个分片上通过自增去实现主键,可能会出现同样的自增值存在于不同的分片上。
  比如,对于电商的订单表orders,其表结构如下(分片键是ocustkey,表的主键是oorderkey):CREATETABLEorders(OORDERKEYintNOTNULLautoincrement,OCUSTKEYintNOTNULL,OORDERSTATUSchar(1)NOTNULL,OTOTALPRICEdecimal(15,2)NOTNULL,OORDERDATEdateNOTNULL,OORDERPRIORITYchar(15)NOTNULL,OCLERKchar(15)NOTNULL,OSHIPPRIORITYintNOTNULL,OCOMMENTvarchar(79)NOTNULL,PRIMARYKEY(OORDERKEY),KEY(OCUSTKEY)。。。。。。)ENGINEInnoDB
  如果把oorderkey设计成上图所示的自增,那么很可能oorderkey同为1的记录在不同的分片出现,如下图所示:
  所以,在分布式数据库架构下,尽量不要用自增作为表的主键:自增性能很差、安全性不高、不适用于分布式架构。
  讲到这儿,我们已经说明白了自增主键的所有问题,那么该如何设计主键呢?依然还是用全局唯一的键作为主键,比如MySQL自动生成的有序UUID;业务生成的全局唯一键(比如发号器);或者是开源的UUID生成算法,比如雪花算法(但是存在时间回溯的问题)。
  总之,用有序的全局唯一替代自增,是这个时代数据库主键的主流设计标准,如果你还停留在用自增做主键,或许代表你已经落后于时代发展了。索引设计
  通过分片键可以把SQL查询路由到指定的分片,但是在现实的生产环境中,业务还要通过其他的索引访问表。
  还是以前面的表orders为例,如果业务还要根据oorderkey字段进行查询,比如查询订单ID为1的订单详情:SELECTFROMordersWHEREoorderkey1
  我们可以看到,由于分片规则不是分片键,所以需要查询4个分片才能得到最终的结果,如果下面有1000个分片,那么就需要执行1000次这样的SQL,这时性能就比较差了。
  但是,我们知道oorderkey是主键,应该只有一条返回记录,也就是说,oorderkey只存在于一个分片中。这时,可以有以下两种设计:同一份数据,表orders根据oorderkey为分片键,再做一个分库分表的实现;在索引中额外添加分片键的信息。
  这两种设计的本质都是通过冗余实现空间换时间的效果,否则就需要扫描所有的分片,当分片数据非常多,效率就会变得极差。
  而第一种做法通过对表进行冗余,对于oorderkey的查询,只需要在oorderkey1的分片中直接查询就行,效率最高,但是设计的缺点又在于冗余数据量太大。
  所以,改进的做法之一是实现一个索引表,表中只包含oorderkey和分片键ocustkey,如:CREATETABLEidxorderkeycustkey(oorderkeyINTocustkeyINT,PRIMARYKEY(oorderkey))
  如果这张索引表很大,也可以将其分库分表,但是它的分片键是oorderkey,如果这时再根据字段oorderkey进行查询,可以进行类似二级索引的回表实现:先通过查询索引表得到记录oorderkey1对应的分片键ocustkey的值,接着再根据ocustkey进行查询,最终定位到想要的数据,如:SELECTFROMordersWHEREoorderkey1step1SELECTocustkeyFROMidxorderkeycustkeyWHEREoorderkey1step2SELECTFROMordersWHEREocustkey?ANDoorderkey1
  这个例子是将一条SQL语句拆分成2条SQL语句,但是拆分后的2条SQL都可以通过分片键进行查询,这样能保证只需要在单个分片中完成查询操作。不论有多少个分片,也只需要查询2个分片的信息,这样SQL的查询性能可以得到极大的提升。
  通过索引表的方式,虽然存储上较冗余全表容量小了很多,但是要根据另一个分片键进行数据的存储,依然显得不够优雅。
  因此,最优的设计,不是创建一个索引表,而是将分片键的信息保存在想要查询的列中,这样通过查询的列就能直接知道所在的分片信息。
  如果我们将订单表orders的主键设计为一个字符串,这个字符串中最后一部分包含分片键的信息,如:oorderkeystring(oorderkeyocustkey)
  那么这时如果根据oorderkey进行查询:SELECTFROMOrdersWHEREoorderkey10001;
  由于字段oorderkey的设计中直接包含了分片键信息,所以我们可以直接知道这个订单在分片1中,直接查询分片1就行。
  同样地,在插入时,由于可以知道插入时ocustkey对应的值,所以只要在业务层做一次字符的拼接,然后再插入数据库就行了。
  这样的实现方式较冗余表和索引表的设计来说,效率更高,查询可以提前知道数据对应的分片信息,只需1次查询就能获取想要的结果。
  这样实现的缺点是,主键值会变大一些,存储也会相应变大。但只要主键值是有序的,插入的性能就不会变差。而通过在主键值中保存分片信息,却可以大大提升后续的查询效率,这样空间换时间的设计,总体上看是非常值得的。
  当然,这里我们谈的设计都是针对于唯一索引的设计,如果是非唯一的二级索引查询,那么非常可惜,依然需要扫描所有的分片才能得到最终的结果,如:SELECTFROMOrdersWHEREoorderate?oorderdate?
  因此,再次提醒你,分布式数据库架构设计的要求是业务的绝大部分请求能够根据分片键定位到1个分片上。
  如果业务大部分请求都需要扫描所有分片信息才能获得最终结果,那么就不适合进行分布式架构的改造或设计。
  最后,我们再来回顾下淘宝用户订单表的设计:
  上图是我的淘宝订单信息,可以看到,订单号的最后6位都是308113,所以可以大概率推测出:淘宝订单表的分片键是用户ID;淘宝订单表,订单表的主键包含用户ID,也就是分片信息。这样通过订单号进行查询,可以获得分片信息,从而查询1个分片就能得到最终的结果。全局表
  在分布式数据库中,有时会有一些无法提供分片键的表,但这些表又非常小,一般用于保存一些全局信息,平时更新也较少,绝大多数场景仅用于查询操作。
  例如tpch库中的表nation,用于存储国家信息,但是在我们前面的SQL关联查询中,又经常会使用到这张表,对于这种全局表,可以在每个分片中存储,这样就不用跨分片地进行查询了。如下面的设计:
  唯一索引
  最后我们来谈谈唯一索引的设计,与主键一样,如果只是通过数据库表本身唯一约束创建的索引,则无法保证在所有分片中都是唯一的。
  所以,在分布式数据库中,唯一索引一样要通过类似主键的UUID的机制实现,用全局唯一去替代局部唯一,但实际上,即便是单机的MySQL数据库架构,我们也推荐使用全局唯一的设计。因为你不知道,什么时候,你的业务就会升级到全局唯一的要求了。总结
  今天介绍了非常重要的分布式数据库索引设计,内容非常干货,是分布式架构设计的重中之重,建议反复阅读,抓住本文的重点,总结来说:分布式数据库主键设计使用有序UUID,全局唯一;分布式数据库唯一索引设计使用UUID的全局唯一设计,避免局部索引导致的唯一问题;分布式数据库唯一索引若不是分片键,则可以在设计时保存分片信息,这样查询直接路由到一个分片即可;对于分布式数据库中的全局表,可以采用冗余机制,在每个分片上进行保存。这样能避免查询时跨分片的查询。
  转自:拉钩教育
投诉 评论

我国能源科技自主创新步伐稳健装备技术取得新突破央视网消息:今年以来,我国能源科技自主创新步伐稳健,煤炭、油气、新能源等领域一批重大技术装备相继取得突破。今年以来,我国能源科技自主创新活跃度明显增强,加速推动燃气轮机、……OPPOReno8高配新机已发布,OPPOReno7惭愧价崩从实样来看,Reno8PRO的成像色彩自然。不同于一般手机激烈的饱和度,可以看到它更浓但不亮,即使是颜色鲜艳的花朵也能保留很好的细节而不会有过多的色彩溢出,包括日常的拍照。因为……侯亮平被查,此侯非彼侯,评论亮了刷头条中,突然蹦出一条侯亮平被查,曾任山东菏泽单县粮食局局长。吓了一跳,《人民的名义》里的侯亮平吗?陆毅啥时候从政去了?仔细一看,此侯亮平非彼侯亮平,转念一想,从古……中国进入第三次开放,格局让中国规则国际化,增强制定权或话语权改革开放40年,中国经济的发展令世界瞩目!2020年11月15日,中国和东盟等国家签署了《区域全面经济伙伴关系协定》(RCEP)。RCEP成员国:东盟十国(印度尼西亚、马……虽然总是产生想法,但人类或许永远不会耗尽想法图片来源:pixabay从如何整理衣柜这种普通的规划到相对论这种复杂的概念,人们总是不断地产生主意。这些或琐碎或重大的想法总是一闪而现,所有人类会耗尽主意吗?以哲学……波波维奇感觉有点对不起湖人,本赛季我们根本没有明确的目标希望越大,失望越大的,本赛季最令人期待,却又让人最失望的球队,无疑就是湖人了。他们的首发和替补中,都存在着曾经的全明星的球员。尽管有些年龄大了,但是一众新生代球员却没有得到真传……分库分表索引设计二级索引全局索引的最佳设计实践主键选择对主键来说,要保证在所有分片中都唯一,它本质上就是一个全局唯一的索引。如果用大部分同学喜欢的自增作为主键,就会发现存在很大的问题。因为自增并不能在插入前就获……摧毁ISIS的孤注一掷之战的发生地,血战后的摩苏尔,满目疮痍全球之旅我在伊拉克摩苏尔大家好,我是申典启,一个实地走访世界各地,关注全球华人的旅行者。在埃尔比勒待了5天时间,和几个中国驴友一块儿逛了逛。接着,我就要只身前……培养孩子三个惹不起的特质,到哪都不会受欺负,你家娃具备吗大家好,我是艾米妈我带4岁的女儿在小区玩滑滑梯时,女儿和几个同龄的小女孩正玩得开心,突然几个稍大点的男孩一窝蜂过来,要插队玩滑滑梯。更有一个小男孩推搡邻居家女儿睿睿……博大胸怀和完美境界海纳百川,有容乃大。壁立千仞,无欲则刚。此乃博大胸怀。忍一时,风平浪静,退一步,海阔天空。此乃完美境界。这种忍让,不是愚蠢傻瓜,不是胆怯懦弱,也不是一味无原则的退却……桃养人,杏害人,李子树下埋死人,是什么意思?又到了瓜果飘香的季节,各种鲜美多汁的水果,实在是琳琅满目。现在桃子、杏子、李子也是应季上市,大家是否对瓜果的挑选有所顾虑呢。我们这里一直都流传着这么一句话桃养人,杏害人,……中国147分先生,狂轰1280,34惨遭逆转北京时间2月19日消息,2022年斯诺克威尔士公开赛资格赛继续进行。第四个比赛日的一场焦点比赛中,中国147分先生周跃龙在32拿到赛点情况下崩盘,34被世界排名第38位的杰米琼……
美国垄断全球浏览器,国内厂商不反击却套用外资内核骗国家你好李焕英在襄阳哪取景的面条与产品简单简陋而是为了更纯粹的美味河畔造句用河畔造句大全互联网广告创业计划书范文饭菜要趁热放冰箱政工干部如何用中国梦引领思想政治工作史密斯造句用史密斯造句大全平凡的造句用平凡的造句大全黄晓明为什么打杨颖身上满是伤痕真相令人心疼高考励志故事花开不败一位高考上复旦的考生励志故事喜讯!莱州新增一家上市公司健力宝掌门李经纬葬礼,各界人士挥泪送行,体操王子李宁数度哽咽视野与幸福感议论文家里硬蜱怎么去除家里硬蜱的去除方法小学生作文开头最常见方式写给闺蜜唯美的句子大全你需要知道的企业网站优化之个技巧冬天为什么不艾灸一天什么时候艾灸最好干货互联网家装产品商业需求文档(BRD)得江楼土石方施工合同办公场地租赁的注意事项有哪些事故责任协议书

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找