Skip to content

异步索引 #4

@dbgp

Description

@dbgp

起源灵感2024-10-16

为一个已经存在的大表创建新的索引是一件很慢的事情,并且一般的做法是只有索引完全建好了才能用,能不能使用正在创建中的索引呢?我想了一下是可以的,并且还能用异步的方式做,这样创建索引的线程中途还能转去做别的事,否则同时创建多个索引就可能拖慢整个系统。
​​​
支持异步索引之后,如果一个表有10个索引,并且其中有一个是唯一索引,那么只需要把数据写到主表和唯一索引就可以返回给客户端了,其他9个索引用异步的方式写,唯一索引要立刻检查记录是否唯一,所以要立刻写,这样记录重复时才能马上向客户端报告错误,如果用异步的方式写,报告错误的时机太晚了。 ​​​

使用异步最大的好处是降低延迟,比如使用异步索引之后,通常只需要写完主表就可以把结果返回给客户端了,不用再等待所有的索引都写完,那客户端看到的数据库延迟就很低了。异步写索引的过程中,客户端又可以发第二条数据过来,也就是异步写索引和网络传数据是同时在进行,所以吞吐也提高了。 ​​​

有了异步索引之后,我发现写索引时都不一定要创建一条 redo log 条目了,现在的实现如果有10个索引还会生成10个 redo log 条目,事务提交后要一起写到硬盘,不但耗时还浪费硬盘空间,这么做只是方便数据库崩溃重启后能同步恢复索引的数据。如果有异步索引了,只需要同步恢复主表的数据即可,加快启动。

第一版本实现索引的创建已经异步化了,为大表创建索引无需再等很久了 committed
on Oct 17, 2024

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions