mycat sql解析模块是mycat实现sql路由模块和sql结果集后处理模块的基础,在mycat的几大模块里面占据相当重要的位置。这篇文章首先简单介绍mycat里面sql解析模块的作用,后面结合部分源码来看这个模块的功能。
本文分析的mycat版本为1.6。假如你使用的是1.4或者1.5,也没关系,因为sql解析功能在1.4和更高版本在大方向上是没怎么变化的。在这里,我们只分析mycat服务(server)端口的sql解析。对于mycat管理(manager)端口的sql解析,不在本文讨论范围内。
1. sql解析模块功能说明
mycat作为一个分布式数据库中间件,其sql解析主要有以下作用:
(1) 判断sql语法是否正确
sql解析模块的一个重要功能就是判断sql是否符合语法要求。因为后端数据库默认对接mysql,所以在sql解析模块默认判断是否符合mysql语法。
(2) sql语句分类并对不同类型的sql语句做不同的逻辑处理
不同的逻辑处理包括决定sql语句是否被支持、sql拦截、sql缓存等。
mycat作为一款中间件,并非所有的mysql语法都支持,因此,对于一些特殊的不支持语法,在sql解析模块解析通过之后需要进行额外的判断, 然后直接返回响应(不支持此语法)给客户端。
(3) 为sql路由模块处理提供服务
sql路由模块是实现mycat分库分表的关键,而sql解析模块是sql路由模块实现的关键。sql路由依赖sql解析结果。举例说明,假设表customer按主键id取模分到2个节点上,其中id % 2 == 0位于dn1, id % 2 == 1 位于dn2,那么对于下面的语句:
select * from customer where id = 1;
经过sql解析模块可以得到where条件id = 1, 在sql路由模块中我们判断到id是分片字段,结合这个表的路由规则判断该语句可以直接发送到dn2。
(4) 为sql结果集后处理模块提供服务