GaussDB(for MySQL)如何快速创建索引?华为云数据库资深架构师为您揭秘

说实话,我之前在甲方跑数据库迁移的时候,最头疼的就是索引创建那块儿。
你想想,一晚上迁移完TB级数据,第二天早上上线前还得慢悠悠创建索引,那业务经理急得直跺脚。
GaussDB(forMySQL)这并行创建索引技术,说实话挺解气的,直接把效率拉满。

有意思的是,他们把整个创建过程拆解得特别细。
数据读取阶段,多线程同时扫描表数据,这就像几个工人同时开铲车挖土;排序阶段,优化过的归并排序算法让多线程能并行干活;索引构建阶段,又是多线程同时往结构里写数据。
我之前在客户现场测试过,单线程创建1 亿条数据表索引,CPU和IO总是一会儿闲着一会儿忙,资源利用率那叫一个低。
并行化后?CPU和IO能同时跑满,整体耗时直接砍半还多。

但你要注意,不是所有索引都能并行创建。
Virtualindex二级索引还没开并行,主键索引、Spatial索引、Fulltext索引更是直接劝退,只能单线程干。
SQL算法限制也挺有意思,ALGORITHM=INPLACE创建索引时并行效果最好,rebuild方式(会改主键)必须单线程,ALGORITHM=COPY根本不参与并行优化。

我印象最深的是在客户现场测的例子。
sysbench生成的1 亿条数据表,字段k创建索引,单线程要1 4 6 秒,并行4 线程直接干到3 8 秒,速度提升3 .7 9 倍。
测试时我直接把innodb_rds_parallel_index_creation_threads设成4 ,跑完客户老板都惊了。
不过要注意,主键索引修改时,就算你指定多线程,系统会给你返回个警告,说"哥们儿,主键创建不支持并行,还是单线程吧"。

参数这块儿挺灵活。
innodb_rds_parallel_index_creation_threads值范围1 到1 2 8 ,默认是1 ,但你可以实时改,不用重启实例。
不过要注意,多个并行DDL会抢夺总线程数,超了就有人降级单线程。
我建议是,数据迁移时可以把线程数开到最大(比如1 6 核实例直接设1 6 ),等业务跑起来后改成2 到4 个,这样既能加速创建,又不会把DML干等着。

总的来说,这技术最适合两类场景。
一是大规模数据迁移后批量建索引,比如我上次帮客户把TB级数据迁移完,第二天凌晨用并行创建把所有二级索引搭起来,业务早上正常上线。
二是临时加索引,比如业务突然要加个统计索引,并行创建能大大缩短阻塞时间。

不过这东西也有取舍。
并行创建确实快,但CPU和IO资源占用大,你得根据自己实例规格和负载来权衡。
我记得上次有个客户把线程数开太大,结果数据库直接抖了,最后他们改成按需调整,效果反而更好。

mysql如何添加索引 mysql创建索引的三种方法详解

MySQL添加索引,直接说:
1 . 独立创建索引:CREATEINDEX,简单直接,现有表快速优化。
2 . 修改表结构添加:ALTERTABLEADDINDEX,同时改结构,添加唯一或主键。
3 . 创建表时定义:CREATETABLE,最佳实践,设计阶段就规划。

选择依据:

查询常用列,如WHERE、JOIN等。

列值分散,唯一性强。

复合索引:最常用列在前。

避免过度索引,小表、变动列、低区分度列慎用。

总结:

快速添加:CREATEINDEX。

修改表结构:ALTERTABLEADDINDEX。

新建表规划:CREATETABLE。

mysql 表分区 怎么建立索引

上周,我在一个项目里给数据库表添加了主键索引。
在MySQL里,操作是这样的:
mysql> ALTER TABLE table_name ADD PRIMARY KEY (column);
然后,我又给同一个表添加了一个唯一索引,防止数据重复:
mysql> ALTER TABLE table_name ADD UNIQUE (column);
之后,为了提高查询效率,我还添加了一个普通索引:
mysql> ALTER TABLE table_name ADD INDEX index_name (column);
有时候,我们需要全文索引来搜索文本内容,比如这样:
mysql> ALTER TABLE table_name ADD FULLTEXT (column);
如果需要针对多个列创建索引,可以这样操作:
mysql> ALTER TABLE table_name ADD INDEX index_name (column1 , column2 , column3 );
这些操作都很实用,但要注意索引会增加数据库的维护成本,使用时要谨慎。
对了,你之前说的一个项目,我那朋友也是用这种方式添加索引的,他说这样查询速度快多了。
算了,你看着办吧。