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

京东云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 在执行过程中,没有触发过任何算子的落盘操作 。
SQL优化案例最佳实践案例一:索引的错误选择导致SQL变慢的优化实践场景:数据库迁移到TiDB,SQL在MySQL运行不到1S,在TiDB运行超过30S
SQL执行计划如下:
京东云TiDB SQL优化的最佳实践

文章插图
execution info列,有该执行计划的时间 , 这个SQL的表的连接顺序,要从最里面的循环开始看,如下图 , m,d是最先开始进行连接的:
京东云TiDB SQL优化的最佳实践

推荐阅读