摘要:
之前在处理的mysql列存储, 与mysql/innodb有显著的差异。
作为列存储, 相比于行存, 获取属性不需要提取一整行, 有磁盘IO上的优势。
但是这主要表现在全表扫描上面, 本文分析相比mysql/innodb更多的不足。
mysql/innodb的查询优化器:
一. 核心在于索引
- 核心在于索引,无论是主键索引还是二级索引, 全文索引
- mysql的查询优化器是基于代价的, 代价的数据来自于所谓的file也就是handler引擎的接口
- 基于代价的计算对于存在主键和非主键的计算公式自然是不同的,
二. 在查询优化阶段便利用索引开始执行查询
- 如果从查询优化的角度, 这也合理, 毕竟利用索引直接求取出子查询的结果,可以在真正执行时仅保留需要继续查询的部分
- 这就将索引的重要性更为凸显
- 同时也将执行阶段和查询优化阶段的边界做的不是严格的划分,看起来不是那么清晰
三. innodb引擎仅提供接口, 由mysql/sql层负责调度
- 不但优化流程由sql层负责, 执行流程也由sql层负责
- innodb引擎实现一系列引擎handler的接口, 由sql层负责调用
- sql层在查询优化过程中填充QEP_TAB结构体, 内部的回调函数是具体的调用流程
mysql列存储引擎:
一. 仅保留一部分mysql/sql层的优化
- 保留了等值谓词消除部分
- 但是更多的sql层优化被屏蔽
二. 直接替代了mysql/sql层的执行部分
- 这点与innodb引擎不同, innodb引擎还是由sql层调用
- 但是mysql列存直接将sql执行的部分做了取代
三. 实现了一套自己的查询树, 对SELECT_LEX做了转换
- 这点是执行的需要, 与sql层做了分割
- 在列存储引擎执行的时候,就只使用自己的语法树规则