MyTopling Parallel Scan
(一)背景
开源数据库 MyTopling 是基于开源存储引擎 ToplingDB 的 MySQL,MyTopling 分叉自 MyRocks,兼容 MyRocks,ToplingDB 分叉自 RocksDB,兼容 RocksDB。MyTopling 和 ToplingDB 相比上游都实现了巨大的性能提升与成本降低。
在阿里云的大力支持下,MyTopling 成功上线计算巢:私有化部署版,高级版,基础版,集成版(集成 LNMP/Wordpress),特价版 2核2G ¥99包年。
(二)Parallel Scan
innodb 有个选项 innodb_parallel_read_threads
,其最典型的用途是在select count(*) from SomeTable
中启用多线程扫描。
我们认为该特性对 MyTopling 引擎也非常有用,但是上游 MyRocks 没有这个功能,并且这个功能还需要下层 ToplingDB 的支持,同样 ToplingDB 的上游 RocksDB 也没有这个支持。
因为这种 Feature 需要很多脏活累活,我们本想着偷懒等上游来实现,前两天实在忍不了,就自己来下手。
(三)引子:并行排序
传统排序算法中,快速排序与归并排序可以优雅地实现多线程排序,其中快排的线程数在递归中先少后多,归并排序线程数的在递归中先多后少。但这都有一个问题,就是无法线性 Scale,瓶颈在于其中的串行部分,例如对于快排:
void pqsort(Type* a, int n) {
if (n set rocksdb_parallel_read_threads = 32;
mysql> select count(*) from bmsql_history;
+-----------+
| count(*) |
+-----------+
| 471235271 |
+-----------+
1 row in set (0.73 sec)
mysql> set innodb_parallel_read_threads = 32;
mysql> select count(*) from bmsql_history_innodb;
+-----------+
| count(*) |
+-----------+
| 471235271 |
+-----------+
1 row in set (10.07 sec)