京东云TiDB SQL层的背景介绍
从总体上归纳 TiDB 和 MySQL 兼容战略,如下表:
SQL层的架构
用户的 SQL 恳求会直接或许经过 Load Balancer 发送到 京东云TiDB Server,TiDB Server 会解析 MySQL Protocol Packet,获取恳求内容,对 SQL 进行语法解析和语义分析,拟定和优化查询方案,履行查询方案并获取和处理数据。数据全部存储在 TiKV 集群中,所以在这个进程中 TiDB Server 需要和 TiKV 交互,获取数据。终究 TiDB Server 需要将查询成果返回给用户。
一条SQL的生命周期图
●SQL优化流程的概览
在 TiDB 中,从输入的查询文本到终究的履行方案履行成果的进程能够见下图:
在经过了 parser 对原始查询文本的解析以及一些简略的合法性验证后,TiDB 首要会对查询做一些逻辑上的等价改动,经过这些等价改动,使得这个查询在逻辑履行方案上能够变得更易于处理。在等价改动完毕之后,TiDB 会得到一个与原始查询等价的查询方案结构,之后依据数据散布、以及一个算子具体的履行开销,来取得一个终究的履行方案,一起,TiDB 在履行 PREPARE 句子时,能够挑选开启缓存来降低 TiDB 生成履行方案的开销。
●运用 EXPLAIN 句子检查履行方案
履行方案由一系列的算子构成。和其他数据库一样,在 TiDB 中可经过 EXPLAIN 句子返回的成果检查某条 SQL 的履行方案。
现在 TiDB 的 EXPLAIN 会输出 5 列,分别是:id,estRows,task,access object, operator info。履行方案中每个算子都由这 5 列属性来描绘,EXPLAIN成果中每一行描绘一个算子。每个属性的具体含义如下:
● EXPLAIN ANALYZE 输出格式
和 EXPLAIN 不同,EXPLAIN ANALYZE 会履行对应的 SQL 句子,记录其运转时信息,和履行方案一并返回出来,能够视为 EXPLAIN 句子的扩展。EXPLAIN ANALYZE 句子的返回成果中添加了 actRows, execution info,memory,disk 这几列信息:
举个比如如下:
从上述比如中能够看出,优化器预算的 estRows 和实践履行中统计得到的 actRows 几乎是持平的,说明优化器预算的行数与实践行数的误差很小。一起 IndexLookUp_10 算子在实践履行进程中运用了约 9 KB 的内存,该 SQL 在履行进程中,没有触发过任何算子的落盘操作。
SQL优化事例最佳实践
事例一:索引的错误挑选导致SQL变慢的优化实践
场景:数据库搬迁到TiDB,SQL在MySQL运转不到1S,在TiDB运转超过30S
SQL履行方案如下:
execution info列,有该履行方案的时刻,这个SQL的表的连接次序,要从最里边的循环开端看,如下图,m,d是最早开端进行连接的:
关注下图的time改动,履行方案由毫秒级变成了秒级的当地,由71ms变成了33s,所以瓶颈卡在((m join d) join taskm)join taskd 这个当地,对应的SQL片段如下:
INNER JOIN taskd
ON taskd.no = d.no
AND taskd.o_no = d.o_no
AND taskd.d_no = d.d_no
AND taskd.w_no = d.w_no
AND taskd.g_no = d.g_no
AND IF(NULL = d.MD5_VALUE, 1, d.MD5_VALUE) = IF(NULL = d.MD5_VALUE, 1, taskd.MD5_VALUE)
AND taskd.yn = 0
●优化思路
1、首要调查 explain analyze 成果,看到慢在最内 3 层的 join 上 ,(m join d) join taskd;
2、对比 MySQL 的履行方案,发现 MySQL 最内的 3 层的 join 是 (m join d) join taskm, 所以把相关的3张表提取出来,修正其join次序;
3、修正次序后,join 的时刻能减少可是和 MySQL距离仍是很大,再次调查,发现 taskd 上TiDB和MySQL运用的索引不一样,所以运用了 use index 来强制TIDB走和MySQL相同的索引。
事例二:表关联的错误挑选导致SQL变慢的优化实践
场景:在MySQL运转时刻毫秒级别,在TiDB运转时刻18S
在TiDB的运转时刻及履行方案
优化前后的履行方案
优化后加了hint的SQL
● 优化思路:
1. TiDB履行耗时 10+s 的原因是对 wps 表的预算不准确,导致优化器认为 w表 和 p表 走 hash join 效率更高,然后我们看到的履行方案的首要耗时在 pri 表回表获取数据的耗时较长 ;
2. w 表预算不准确的原因为TiDB 会把 w 的条件 有range scan 转换点查,然后运用这个索引的统计信息去预算;
3. 点查预算是会运用对应的 CMSketch 去进行预算,结合 p 表数据量很大,依据经历推测可能是 CMSketch 内部 hash 冲突导致。
●事例一、二的延伸扩展:
在SQL优化的工作中,经常会经过加hint的方法改动SQL的履行方案,从而到达了优化的目的,可是缺点是对SQL进行了硬编码,如果事务程序运用了ORM结构,SQL的改造难度会添加。SQL Binding(SPM)则很好的解决了硬编码的问题,经过SQL Binding,DBA能够在不改动SQL文本的情况下,优化sql的履行方案,从而到达优化的目标,从而使SQL优化变得愈加优雅。
京东云联合 PingCAP 根据国内开源 NewSQL 数据库 TiDB 打造的一款一起支持 OLTP 和 OLAP 两种场景的散布式云数据库产品,实现了自动的水平弹性,强一致性的散布式事务,布置简略,在线异步表结构改变不影响事务,一起兼容 MySQL 协议,使搬迁运用成本降到极低。
作者:赵玉龙