范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

如何加索引(数据库怎么加索引)

  ​​​​​此账号为华为云开发者社区官方运营账号,提供全面深入的云计算前景分析、丰富的技术干货、程序样例,分享华为云前沿资讯动态
  本文分享自华为云社区《GaussDB(for MySQL)如何快速创建索引?华为云数据库资深架构师为您揭秘》,作者:华为云数据库资深架构师苏斌。
  苏斌,华为云数据库资深架构师,拥有16年数据库内核研发经验,之前作为MySQL官方InnoDB团队主要研发人员,参与和主导了多个重要特性的开发和发布。目前在华为公司负责和参与华为云RDS主要产品RDS for MySQL和GaussDB(for MySQL)内核功能的设计和研发。关于MySQL索引
  我们都知道,数据库使用索引技术加快数据的查询。MySQL数据库也支持若干种索引结构提高查询的性能(参见MySQL文档:https://dev.mysql.com/doc/refman/8.0/en/create-index.html),其中使用最广泛的是B tree索引,因为B tree索引在查询和修改的性能之间有很好的平衡,同时其存储和维护的代价也是比较优的。
  MySQL的表本身由聚簇索引(必须是B tree索引)表示,再加上若干个二级索引,包括B tree索引,共同组成一个MySQL的独立表,可以说MySQL的表是由一组索引共同组成的。我们都知道索引是一把双刃剑,充分的索引可以更好地提升可以适配的查询的性能,但是需要维护这些索引使得其和数据同步,所以在数据修改操作阶段,更多的索引也会带来更高的开销。索引创建与否的权衡通常是动态的,用户不一定能做到在表定义之初就知道需要建立哪些索引,需要随着业务的发展变化而调整索引,这也带来了动态索引创建的一些问题。MySQL的索引创建逻辑
  我们先看一下MySQL索引创建的逻辑。首先,MySQL索引的创建可以使用两种不同的DDL(Data Definition Language: 数据定义语言)算法来实现。第一种是COPY算法,它非常低效,就是在两个表之间进行数据拷贝,来完成表结构相关的修改,尤其是它要求加表锁,现在基本不使用了。第二种是INPLACE算法,该算法不要求加锁,因此很多DDL操作是不阻塞DML(Data ManipulationLanguage: 数据操纵语句)操作的,比如创建索引。该算法具体的实现在存储引擎层面完成,可以进行更多的优化。实际上DDL语句还有一种INSTANT算法,但是它无法支持创建索引操作,这里不展开介绍。
  对于INPLACE算法,在5.7版本之前,是采用索引记录不断地向建好的空索引插入的方式。由于插入的数据的无序性,该方法导致了明显的性能问题和潜在的空间浪费。在5.7版本以后,MySQL优化了建索引步骤,将其改进为对已排序的索引记录进行自底向上批量插入并且紧凑拼装的创建方式,如果有多个索引要创建,会单独对每个索引执行相同的算法。新的算法会经历读取数据、排序数据和创建索引这几个主要步骤。
  总体而言,创建索引这类DDL操作,会比普通的DML等操作要费时,而该类DDL耗时会导致用户在继续动态添加索引加速查询的时候,需要等待很长的时间,极大影响业务;而且用户的MySQL实例开启了Binlog复制,耗时的DDL操作容易引起备库的长时间落后。
  MySQL的创建索引流程图云化场景下索引创建的问题
  随着越来越多用户把数据托管在云服务上,以及用户数据量的不断增长,前述的动态添加索引导致的问题非常影响用户体验。同时客户的单表数据逐渐达到几TB甚至几十TB,客户对创建索引太慢所带来的性能问题的抱怨越来越多,尤其是创建索引周期如果太长,我们可能很难找到一段合适的业务低峰期来动态创建索引,避免业务的波动。因此,如何在云服务环境下,解决客户基于大量数据创建索引的性能问题,成为云服务厂商的一个挑战。
  在云化场景下,还有一个主要场景对客户的体验非常重要。我们知道客户的业务要迁移上云,需要对数据进行大规模的迁移(华为云提供了数据复制服务DRS工具支持各类数据迁移场景),数据迁移比较高效的方式为:
  1)逻辑导出源端数据
  2)在目标端建表(注意,表不含二级索引)
  3)将源端导出的数据插入到目标端
  4)对目标端的表建立二级索引
  如果涉及动态数据同步,相关步骤会更复杂一些,由于和该主题无关,这里不展开。以上步骤中,需要重点注意的是步骤2和4,在目标端创建表的时候先不创建二级索引。这个优化对性能影响很大,尤其是一个表有很多二级索引的场景。我们知道Btree索引的插入如果是有序的,对插入性能和结果的空间利用率是最好的,因为Btree索引的分裂会在插入区域的尾部产生,同时由于分裂算法的优化,分裂产生的页面填充率会比较高;相反地,如果是随机插入,尤其是并发地随机插入,很容易导致Btree索引在不同的节点进行分裂,并且分裂后的页面填充率都处于一个半满的状态,导致Btree最终的一个膨胀。
  有了这个背景之后,我们就容易理解上面的问题,插入表数据的时候,我们屏蔽了二级索引,等所有数据都准备好了,再采用批量建立索引的方式创建二级索引,这对于二级索引创建效率是最高的。如果不这么做,每插入一条记录,就要去插入相应的二级索引,那么二级索引就是一个无序的随机插入,并发起来性能会变差很多。
  虽然在数据同步准备好后,批量创建二级索引是一个有效的方案,但是如果数据量很大,这么创建二级索引还是非常耗时,导致客户在数据迁移完之后需要等待很长时间才能开展业务,这个等待周期可能是小时甚至天级别的。虽然可以考虑表级别的并发创建索引,但是这个方法也有明显的缺点:应用场景有限,要求有多表;以及表和表之间的并发其实不是一个最有效的并发形式,相互影响比较大。GaussDB(for MySQL)如何快速创建索引?
  综上所述,在创建索引这个点上存在两个性能瓶颈点:一个是用户迁移数据之后的批量索引创建;第二个是用户临时需要添加一个二级索引。无论哪个点,我们都需要更快的建立好索引,提升用户的使用体验。
  华为云GaussDB(for MySQL)引入了并行创建索引的技术,它改进了社区版MySQL创建索引只用单线程的问题,以此提高创建索引的效率,并一起解决了前述两个痛点。前面提到的社区版创建索引逻辑是单线程的,首先存在资源利用率不够饱满的问题;其次创建索引过程是CPU和IO开销交替进行的过程,在做一个操作的时候,即使不是资源竞争的操作也只有等待。多线程创建索引可以充分利用CPU和IO资源,同时有的线程在做CPU计算时,别的线程可以并发的做IO操作。
  GaussDB(for MySQL)使用的并行创建索引,是一个全链路的并行技术。前面提到,创建索引包含了若干个阶段,我们的并行创建算法,对这里的每个阶段都做并行处理,从读取数据、排序、到创建索引,都是并行操作,每一步都由指定的N个线程并发处理。它的逻辑如下图所示:
  GaussDB(for MySQL)尤其对数据的归并排序做了多种优化,使得我们常规的归并排序能够充分的并行,充分利用CPU、内存和IO的资源。在并行创建索引之后的合并步骤,也使用了一套简化的算法,正确处理各种索引结构的场景。支持的索引和场景
  GaussDB(for MySQL)的并行创建索引功能,目前支持的索引为Btree二级索引。对于virtual index二级索引,将会在不久的将来提供全面的支持,而MySQL的spatial index和fulltext index不在该并行创建索引覆盖范围内。
  特别要注意的是,主键索引的创建目前也是不支持并行的,因此如果一个并行创建索引的SQL语句包含创建主键索引,或者前面提及的spatial index与fulltext index,那么客户端将会收到一个告警,提示该操作不支持并行创建索引,同时该语句会采用单线程创建索引的方式执行完成。
  从SQL语句的角度,如前所述,创建索引可以采用不同的算法,由于COPY算法(ALGORITHM=COPY)不是采用批量插入的方式,因此不会受益于该并行创建索引优化。而对于INPLACE算法,如果创建索引用的是非rebuild的方式,都可以受益于该优化;一旦需要使用rebuild的方式创建索引,因为涉及到主键索引的建立,将无法使用并行创建索引的算法。示例
  下面我们通过几个实例来了解一下如何使用并行创建索引算法加快创建速度,以及我们的条件约束是如何生效的。
  1.我们使用sysbench的表,表内有1亿条数据
  2.在该表的k字段建索引,采用社区默认单线程,耗时146.82s
  3.通过设置innodb_rds_parallel_index_creation_threads= 4启用4个线程建索引,可以看到建索引耗时38.72s,速度提升3.79倍。
  4. 假设我们要修改主键索引,虽然指定了多线程,但是会收到一个warning,实际上只能通过单线程建索引
  注意事项
  首先对innodb_rds_parallel_index_creation_threads这个参数进行一下说明,它控制了系统中所有并行DDL可以使用的总线程数,取值范围是[1-128]。该参数取值为1表示使用原始的单线程创建索引,取值为N,表示接下来的DDL使用N个线程创建。如果一个DDL使用了100个线程在执行,那么另外一个也要使用并行的DDL且最多只能使用剩下的28个线程;而如果128个线程都被并行DDL语句占用了,新来的DDL只能走原始的单线程创建的逻辑。
  虽然该并行创建索引加快了索引的创建速度,但是在具体使用场景下,还是需要有审慎的评估。我们知道在并行算法应用之后,该DDL对硬件资源的使用会尽可能的充分,这也意味着其它操作就得不到太多的资源了。因此,针对不同的场景需要具体地分析,它决定了我们如何创建索引。
  对于迁移场景,由于这时候还没有任何业务接入,用户希望尽快完成所有索引的创建,因此可以尽量设置多线程数,比如我们是16核规格的实例,那么我们就可以把并行线程的数量指定为16,加速完成操作。
  如果是用户业务运行阶段要创建索引,我们还是不希望DDL操作,对正在运行的业务如DML操作等有太多的影响。因此,这时候创建索引可以指定相对少一些的线程数量,比如2-4(或者根据CPU规格以及负载决定,同时不鼓励并发地执行多个DDL操作)。这样既能相对地加速创建索引的进程,也能保证DML的正常进行。
  综上所述,GaussDB(for MySQL)支持了并行创建索引,通过缩短创建索引使用的时间,很好地解决了客户关切的两类问题,提升了客户的体验。但技术无止境,在创建索引领域,还有其它的问题需要我们优化解决,例如如何减少创建索引步骤对IO的影响等等。我们后续会针对这些点进行优化,给客户带来更多的惊喜。
  目前,华为云GaussDB(for MySQL) 并行创建索引优化功能已上线,欢迎大家前往华为云官网体验:云数据库_GaussDB(for MySQL) _分布式云数据库-华为云
  附:华为云GaussDB(for MySQL)内核专家系列文章
  华为海外女科学家为您揭秘:GaussDB(for MySQL)云栈垂直集成的力量有多大?华为海外女科学家为您揭秘:GaussDB(for MySQL)云栈垂直集成的力量有多大?-云社区-华为云
  华为云数据库内核专家为您揭秘:GaussDB(for MySQL)并行查询有多快?华为云数据库内核专家为您揭秘:GaussDB(for MySQL)并行查询有多快?-云社区-华为云
  点击,第一时间了解华为云新鲜技术~华为云博客_大数据博客_AI博客_云计算博客_开发者中心-华为云

鱼煎多久熟(电饼铛煎带鱼几分钟熟)回味小时候小时候吃的最多的就是这香煎带鱼,不仅做法简单,只要这带鱼一上桌,哥哥姐姐弟弟妹妹就人手一块吃得不亦乐乎!By神鲜厨房用料鲜到鲜得舟山带鱼300克面粉小半碗料酒适量盐适量白花甲多久熟(花甲肉嚼不烂是没熟吗)蛤蜊还是不错的烹饪食料,但是一定要吃鲜活的,买来后用清水加入少量盐浸泡一小时,吐净泥沙,那么花蛤煮多长时间?花蛤煮多久能熟?无论是水煮花蛤还是爆炒花蛤,都少不了水煮这一步骤,水煮花怎么样煎鸡蛋(煎鸡蛋的做法)怎么样煎鸡蛋(煎鸡蛋的做法)口味孜然难度简单时间十分钟鸡蛋2个盐少许孜然粉3克五香粉少许1。平底锅里放少许油,小火开始煎,打入两个鸡蛋。2。打入鸡蛋后,不要翻动,均匀的撒上少许盐,豆腐怎么做好吃又简单(鸡蛋煎豆腐)大家好,我是第一美食阿飞,每天都有几道美食分享给你,我带你领略四海八荒的舌尖美味。像鸡蛋豆腐都是家常中最最常见的食材,两者口感有所相似,但把它们相组合又能碰出怎么样的味蕾呢。那么今鸡蛋怎么煎(煎蛋怎么把蛋黄煎熟)导语香煎荷包蛋,热油下锅煎就错了,教你一招,鸡蛋圆润不散光,太实用了!现在物价越来越高了,很多肉都卖得越来越贵,这时,就有了替代品。鸡蛋在日常生活中,可谓是最亲民的食物了,物美价廉如何煎鸡蛋(煎鸡蛋怎么煎才好吃窍门)新入手了一个美锅喜欢的不得了,用它做了一个低油健康又美味的番茄蛋,虽然油少但是它的蓝宝石不粘技术,国际一级不粘,一点都不会粘锅,特别适合轻食爱美的女生。By龙卷风中的汗猫用料番茄2炸知了多久(电饼铛煎知了猴需要多长时间)大家好,今天用知了猴分享一个好吃的做法,2个步骤在家做,外脆里嫩,比吃鸡蛋还营养,我们这里一块钱一个。先用清水把知了猴清洗干净,再加一勺盐,浸泡半个小时。烧一锅开水,然后下入知了猴怎么煎豆腐(家常煎豆腐的做法)今天和大家分享一道糖醋脆皮豆腐家常做法,豆腐煎成两面金黄,再裹上料汁,酸甜开胃,有喜欢的朋友们赶紧学习一下。食材老豆腐辅料大蒜小葱调料番茄酱食盐白糖陈醋鸡精蚝油老抽糖醋脆皮豆腐酸甜玉溪烟价格表和图片(玉溪价格大全集)玉溪烟价格表和图片(玉溪价格大全集)黑龙江省双鸭山市男子那某某在2021年2月27日22时许,在瓦房店市建设小区福源超市内,那某某用事先准备的啤酒瓶碎片威胁被害人林某,抢走一盒软包有哪些狗品种(黑白狗品种大全集及图片)很多新手在有了养狗的想法后可能会困惑于养什么样的狗,今天我根据狗狗的体型整理了常见的狗狗品种,快收好这份攻略吧因为是根据狗狗体型分的类,所以在养狗前,应该先考虑一下自己的家庭空间是插座哪里买(插座种类大全集图片)要跟大家说抱歉,这几年几乎每年的618和双十一我都会写一篇关于开关插座的新品对比,今年已经过了618了才写出来,耽误大家的618购买了,不过也不算太晚,不是还有双十一的嘛,收下这篇
行程问题(行程问题的九个公式)行程问题(行程问题的九个公式)行程问题基本相遇追及问题理解相向而行,同向而行,背向而行关键词语。相向而行面对面,方向相反同向而行方向相同背向而行背对背,方向相反。基本相遇问题路程速龙王的九个儿子(龙的九个儿子是谁?)龙王的九个儿子(龙的九个儿子是谁?)龙,是我们中华民族的图腾,传说中,它和自然界中的生物生下了自己的九个儿子,它的九个儿子本领各异,共同守护着中华民族。老大囚牛囚牛是龙和一条金蛇所龙的九子(龙的九个儿子分别是谁?)龙的九子(龙的九个儿子分别是谁?)中国民间自古以来就流传着一句话龙生九子,各有不同。相信很多人都听过这句话吧,但是却很少有人知道龙所生的九子到底是哪九子,他们有什么不同。有说法认为钢琴有多少个琴键(88钢琴怎么标数字)一概念不同钢琴(piano),键盘乐器,内部装有许多钢丝弦和包有绒毡的木槌,一按键就能带动木槌敲打钢丝弦而发出声音。电子琴(electronickeyboard),键盘乐器,采用半唐氏筛查看男女(唐氏筛查hcg看男女公式)唐氏筛查看男女(唐氏筛查hcg看男女公式)医生随口说这小家伙腿长准妈咪暗想是不是男孩呀?医生随口说这孩子力气真大准妈咪暗地里想力气大,分明是男宝的暗示嘛医生随口说这娃懒得动啊,就是唐氏塞查主要查些什么(唐氏筛查几周做最好)在我接触过的产妇中,有不少人对唐氏筛查不了解。有的人会问我为什么唐筛的结果是低危,但是最后还是生出了唐氏宝宝?其实这就是唐氏综合征,也叫作21三体综合征,指的是这部分孩子天生的第2唐氏筛查多久做(唐氏筛查不做可以吗)唐筛和糖筛是完全不同的概念。糖筛是妊娠期糖尿病的筛查,它针对的是孕妇。唐筛是唐氏综合征的筛查,它主要针对的是胎儿。唐氏综合征现在主要是通过筛查的手段来早期发现。孕妇怀孕以后要及时的无创dna什么时候做(十个唐筛九个高危)高通量测序技术应用于产前筛查,既是我们常说的无创胎儿DNA产前检测。这项技术一经在临床应用,便以迅雷不及掩耳之势普及开来,大多数孕妇及家属将其作为免受羊膜腔穿刺术的救命稻草,不管什拔牙多久可以怀孕(拔牙多久可以做备孕检查)网友亲历我曾经有颗横生智齿,十年前它开始生长,并且牙龈发炎导致高烧,医生说要划开肉让它长出来很不幸我去的是个社区小诊所,没有拍片也不知道它是横着长的,因为惧怕嘴里含刀的感觉,吊水几远景怎么样(吉利远景的故障率)数字化时代,用户口碑数据对消费者的交易决策和生产者的产品服务的改进都将起到重要的推动作用。立足于此,专业的汽车质量与产品口碑研究服务平台汽车门网将基于2020年全年汽车质量投诉口碑吉利新远景怎么样(09年吉利远景怎么样)如今的女神不再像前些年那样只喜欢暖男了,对于金钱实在帅气贴心和温暖也非常看重,所以如果你不具备以上条件,女神对你而言只能远看而不可亵玩,不过现实生活中经济适用男则是生活的最伴侣,他