MySQL存储引擎之Spider内核深度解析
|
上面提到Spider的作用类似一个proxy,本身并不存储数据.因此Spider处理SELECT语句(UPDATE与DELETE类似)首先需要根据查询解析的信息生成一个SELECT语句,发送到查询涉及的后端节点,将数据从远端拉到本地,然后进行处理.函数spider_db_append_select_columns根据查询涉及的读集以及写集获取相应的字段,构造一个SQL语句从后端节点拉取数据到本地.如果涉及多个分片,spider将从不同实例获取过来的结果集存放在不同的结果集spider_db_result中.类spider_db_fetch提供了fetch_next,? current_row等方法供上层方法调用.Server层调用get_next方法驱动引擎层获取下一条数据. 对于表访问方法,MySQL实现了索引扫描(ha_index_read)与随机访问(ha_rnd_next)的方法.对于切分为多个分片的DB,索引扫描需要借助优先队列.索引扫描需要区分是否是第一次调用该方法.如果是第一次调用该方法,需要遍历所有的分片读取一条记录,然后插入到优先队列.对应到Spider,如果第一次调用访问远端实例表的方法,需要生成SELECT语句,将远端实例的数据拉到本地存放.在使用索引扫描的情况,MySQL 为每个分片保留一个key buffer以及record buffer.server 利用队列头部的m_top_entry 获得访问的分片ID.接着,调用get_next方法获取相应的元组,将返回的数据存放在record buffer,并插入到优先队列.函数最后将元组从优先队列返回. 为缓解内存等资源的压力,Spider实现全表扫描的方法是逐个分片串行扫描(为了加速,spider也提供了并行扫描数据节点的选项).图8给出了Spider对于上述两种表访问方法的实现机制. (编辑:网站开发网_盐城站长网 ) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |

