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


?????此账号为华为云开发者社区官方运营账号,提供全面深入的云计算前景分析、丰富的技术干货、程序样例,分享华为云前沿资讯动态

本文分享自华为云社区《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,客户对创建索引太慢所带来的性能问题的抱怨越来越多,尤其是创建索引周期如果太长,我们可能很难找到一段合适的业务低峰期来动态创建索引,避免业务的波动 。因此,如何在云服务环境下,解决客户基于大量数据创建索引的性能问题,成为云服务厂商的一个挑战 。


以上关于本文的内容,仅作参考!温馨提示:如遇健康、疾病相关的问题,请您及时就医或请专业人士给予相关指导!

「四川龙网」www.sichuanlong.com小编还为您精选了以下内容,希望对您有所帮助: