下图展示了一个如何使用 proxy 将客户端发送过来的 query 注入到 query 队列的例子。因为 proxy 位于客户端和 MySQL 服务器之间,所以经由 proxy 发送到服务器,以及由 proxy 最终返回给客户端的信息,不需要做到完全匹配或者关联。一旦客户端连接到了 proxy ,下图中展现的由客户端发送每一个单独的 query 引起的命令序列将会发生。
当客户端向 proxy 提交了一个 query 的时候,proxy 内部的 read_query() 函数将会被触发。该函数会添加 query 到 query 队列中。
一旦 read_query() 函数执行完毕, query 会按加入队列的顺序向 MySQL 服务器提交。
MySQL 服务器会返回由每一个 query 所产生的结果集,每一个提交的 query 对应一个结果集。当结果集到达 proxy 后,read_query_result() 函数会被触发,在每一次触发的时候都可以由我们自己决定哪个结果集需要发送回客户端。
例如,你可以向全局 query 队列中添加额外的 query 让服务器来进行处理。可以用于在原始 query 的前后添加获取统计信息的 query 语句的方式对原始 query 进行改变:
1 |
|
改变为一系列 query:
1 2 3 |
|
你同样可以修改原始的语句,例如,向每一条要执行的语句中添加 EXPLAIN 以获取该语句如何被处理的信息,同样也是将原始 query 语句进行改变,变成下面一系列语句:
1 2 |
|
在上述两个例子中,客户端将会收到比预期更多的结果集。无论你如何控制进入的 query 以及返回的结果,由 proxy 返回的对应 query 数量的结果集必须要与由客户端原始发送的 query 数目相等。
你可以调整客户端代码以便处理由 proxy 返回的多个结果集,但是在大多数情况下,你会希望 proxy 的存在对于客户端来说是透明的。为了保证这一点,query 的数量和结果集的数量应该保持一致,你可以使用 MySQL Proxy 的 read_query_result() 函数来提取额外的结果集信息,以便只返回客户端原始 query 对应的结果集。你可以通过在向 query 队列中添加 query 时,赋予每一个 query 一个唯一的 ID 的方式来保证这点,然后当 read_query_result() 函数 在后续处理中收到结果集时通过匹配该 ID 的方式过滤掉额外的结果集。