EN
注册
我要评分
文档获取效率
文档正确性
内容完整性
文档易理解
在线提单
论坛求助

实现原理

在并行查询中涉及到2个关键事件:表的切分和执行计划的改造。

  • 表的切分

    将扫描的数据划分成多份,让多个线程并行扫描。innoDB引擎是索引组织表,数据以B+tree的形式存储在磁盘上。分区的逻辑为,从根节点页面出发,逐层往下扫描,当判断某一层的分支数超过了配置的线程数,则停止拆分。在实现时,实际上总共会进行两次分区。第一次是按根节点页的分支数划分分区,每个分支的最左叶子节点的记录为左下界,并将这个记录记为相邻上一个分支的右上界。通过这种方式,将B+tree划分成若干子树,每个子树就是一个扫描分区。经过第一次分区后,可能出现分区数不能充分利用多核问题,比如配置了并行扫描线程为3,第一次分区后,产生了4个分区,那么前3个分区并行做完后,第4个分区至多只有一个线程扫描,最终效果就是不能充分利用多核资源。

    为解决第一次分区的负载不均衡问题,将对第4个分区进行第二次分区。第二次分区后,可以获得多个更小数据量的块,这样可以使每个线程的扫描数据更加均衡。

  • 执行计划改造

    MySQL的执行计划是一棵左深树,在并行执行之前,MySQL使用一个线程递归的执行这棵左深树,然后将join结果进行sort或者aggregation。并行的目标就是使用多个线程来并行执行这颗执行计划树。将第一张non-const primary表进行拆分,每个线程的执行计划与原执行计划完全相同,只是第一张表只是该表的一部分,这样一来,每个线程就执行了一部分的执行计划,这些线程称为worker线程。执行完后,将结果交给leader汇总,然后再执行sort、aggregation或者直接发给客户端。