tidb-server是批量还是一行一行发送数据到客户端

为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。

  • 【TiDB 版本】:
    tidb-server -V
    Release Version: v4.0.0-beta.2-949-g3f38fa5d0-dirty
  • 【问题描述】:

在查看tidb-server 发送数据到客户端的函数中。找到这个 writeChunks()

问题:这是一行一行发送数据,没找到批量发送相关内容。

  for i := 0; i < rowCount; i++ {

            data = data[0:4]

            if binary {

                data, err = dumpBinaryRow(data, rs.Columns(), req.GetRow(i))

            } else { 

                data, err = dumpTextRow(data, rs.Columns(), req.GetRow(i))

            }

            if err != nil {

                return err

            }

            //发送网络包

            if err = cc.writePacket(data); err != nil {

                return err

            }

        }

类似提问:https://github.com/pingcap/tidb/issues/19685

问题收到,稍后会有同事答复,多谢。

TiDB 在内部处理数据是一批一批的,到了发送结果给客户端时,是一行一行的。
需要把一个 chunk 的数据按行转换成 MySQL 的编码格式了发送出去。
MySQL 的消息包的编码格式可以在这里找到

https://dev.mysql.com/doc/internals/en/com-query-response.html

2 个赞

多谢,看的不精,继续看

转码归转码,但是跟一行一行发送没关系吧。

这里虽然是看起来每行发送一次,但是内部使用的是bufio, 是有缓存的。
p.bufWriter = bufio.NewWriterSize(bufReadConn, defaultWriterSize) , defaultWriterSize = 16384

也就是默认是每16384字节才调用一次系统调用吧

此话题已在最后回复的 1 分钟后被自动关闭。不再允许新回复。