-
Notifications
You must be signed in to change notification settings - Fork 0
Open
Description
为一个已经存在的大表创建新的索引是一件很慢的事情,并且一般的做法是只有索引完全建好了才能用,能不能使用正在创建中的索引呢?我想了一下是可以的,并且还能用异步的方式做,这样创建索引的线程中途还能转去做别的事,否则同时创建多个索引就可能拖慢整个系统。
支持异步索引之后,如果一个表有10个索引,并且其中有一个是唯一索引,那么只需要把数据写到主表和唯一索引就可以返回给客户端了,其他9个索引用异步的方式写,唯一索引要立刻检查记录是否唯一,所以要立刻写,这样记录重复时才能马上向客户端报告错误,如果用异步的方式写,报告错误的时机太晚了。
使用异步最大的好处是降低延迟,比如使用异步索引之后,通常只需要写完主表就可以把结果返回给客户端了,不用再等待所有的索引都写完,那客户端看到的数据库延迟就很低了。异步写索引的过程中,客户端又可以发第二条数据过来,也就是异步写索引和网络传数据是同时在进行,所以吞吐也提高了。
有了异步索引之后,我发现写索引时都不一定要创建一条 redo log 条目了,现在的实现如果有10个索引还会生成10个 redo log 条目,事务提交后要一起写到硬盘,不但耗时还浪费硬盘空间,这么做只是方便数据库崩溃重启后能同步恢复索引的数据。如果有异步索引了,只需要同步恢复主表的数据即可,加快启动。
第一版本实现索引的创建已经异步化了,为大表创建索引无需再等很久了 committed
on Oct 17, 2024
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels