查询处理

default

查询处理

Query Manager 会负责将用户编写的 SQL 语句转化为能够被快速执行的代码,然后将代码执行的结果返回给 Client Manager。其会包含以下几个步骤:

  • 首先判断查询语句是否有效,若有效则进行由 Parser 进行语法分析。

  • 然后由 Rewriter 进行改写以移除无效的操作符,并且进行预优化操作。

  • 接下来由 Optimizer 使用 CBO 等算法进行优化操作,将其转化为高性能的可执行的数据访问方案。

  • 最后编译与执行上述数据访问方案,得到最后的结果。

查询流程

当查询的时候会先通过索引定位到对应的数据页,然后检测数据页是否在缓冲池内,如果在就直接返回,如果不在就去聚簇索引中通过磁盘 IO 读取对应的数据页并放入缓冲池。一个数据页会包含多个数据行。缓存池通过 LRU 算法对数据页进行管理,也就是最频繁使用的数据页排在列表前面,不经常使用的排在队尾,当缓冲池满了的时候会淘汰掉队尾的数据页。从磁盘新读取到的数据页并不会放在队列头部而是放在中间位置,这个中间位置可以通过参数进行修。缓冲池也可以设置多个实例,数据页根据哈希算法决定放在哪个缓冲池。

MySQL 存储结构一文中,我们讨论过 MySQL 数据页的存储结构。由于索引只能定位到数据页,而定位到数据页内的行记录还需要在内存中进行二分查找,而这个二分查找就需要借助 slot 信息,先找到对应的 slot,然后在 slot 内部通过数据行中记录头里的下一个记录地址进行遍历。每一个 slot 可以包含 4 到 8 个数据行。如果没有 slot 辅助,链表本身是无法进行二分查找的。

链接