京东云TiDB SQL优化的最佳实践

京东云TiDB SQL层的背景介绍从总体上概括 TiDB 和 MySQL 兼容策略 , 如下表:

京东云TiDB SQL优化的最佳实践

文章插图
SQL层的架构用户的 SQL 请求会直接或者通过 Load Balancer 发送到 京东云TiDB Server , TiDB Server 会解析 MySQL Protocol Packet , 获取请求内容 , 对 SQL 进行语法解析和语义分析 , 制定和优化查询计划 , 执行查询计划并获取和处理数据 。数据全部存储在 TiKV 集群中 , 所以在这个过程中 TiDB Server 需要和 TiKV 交互 , 获取数据 。最后 TiDB Server 需要将查询结果返回给用户 。
京东云TiDB SQL优化的最佳实践

文章插图
一条SQL的生命周期图
●SQL优化流程的概览在 TiDB 中 , 从输入的查询文本到最终的执行计划执行结果的过程可以见下图:
京东云TiDB SQL优化的最佳实践

文章插图
在经过了 parser 对原始查询文本的解析以及一些简单的合法性验证后 , TiDB 首先会对查询做一些逻辑上的等价变化 , 通过这些等价变化 , 使得这个查询在逻辑执行计划上可以变得更易于处理 。在等价变化结束之后 , TiDB 会得到一个与原始查询等价的查询计划结构 , 之后根据数据分布、以及一个算子具体的执行开销 , 来获得一个最终的执行计划 , 同时 , TiDB 在执行 PREPARE 语句时 , 可以选择开启缓存来降低 TiDB 生成执行计划的开销 。
●使用 EXPLAIN 语句查看执行计划执行计划由一系列的算子构成 。和其他数据库一样 , 在 TiDB 中可通过 EXPLAIN 语句返回的结果查看某条 SQL 的执行计划 。
目前 TiDB 的 EXPLAIN 会输出 5 列 , 分别是:id , estRows , task , access object ,  operator info 。执行计划中每个算子都由这 5 列属性来描述 , EXPLAIN结果中每一行描述一个算子 。每个属性的具体含义如下:
京东云TiDB SQL优化的最佳实践

文章插图
● EXPLAIN ANALYZE 输出格式和 EXPLAIN 不同 , EXPLAIN ANALYZE 会执行对应的 SQL 语句 , 记录其运行时信息 , 和执行计划一并返回出来 , 可以视为 EXPLAIN 语句的扩展 。EXPLAIN ANALYZE 语句的返回结果中增加了 actRows, execution info,memory,disk 这几列信息:
京东云TiDB SQL优化的最佳实践

文章插图
举个例子如下:
京东云TiDB SQL优化的最佳实践

文章插图
从上述例子中可以看出 , 优化器估算的 estRows 和实际执行中统计得到的 actRows 几乎是相等的 , 说明优化器估算的行数与实际行数的误差很小 。同时 IndexLookUp_10 算子在实际执行过程中使用了约 9 KB 的内存 , 该 SQL 在执行过程中 , 没有触发过任何算子的落盘操作 。

经验总结扩展阅读