于是,TiDB 实现了batchChecker,代码在executor/batch_checker.go。 在batchChecker中,首先,拿待插入的数据,将其中可能冲突的唯一约束在getKeysNeedCheck中构造成 Key(TiDB 是通过构造唯一的 Key 来实现唯一约束的,详见《三篇文章了解 TiDB 技术内幕——说计算》)。 然后,将构造出来的 Key 通过BatchGetValues一次性读...
在先前的 TiDB 源码阅读系列文章(四)中,我们介绍了 Insert 语句,想必大家已经了解了 TiDB 是如何写入数据,本篇文章介绍一下 Select 语句是如何执行。相比 Insert,Select 语句的执行流程会更复杂,本篇文章会第一次进入优化器、Coprocessor 模块进行介绍。
Drainer 会根据下游类型自动选择不同的 Checkpoint 实现,例如 TiDB / MySQL 的下游就会使用MySQLCheckPoint,File(增量备份) 则使用PbCheckpoint。 在Syncer 小节,我们看到 Syncer 的Successes方法提供了一个 channel 用来接收已经处理完毕的 binlog,收到 binlog 后,我们用 Checkpoint 的Save方法保存 binlog 的 commit t...
TiDB 源码阅读系列文章(七)基于规则的优化 在TiDB 里面,SQL 优化的过程可以分为逻辑优化和物理优化两个部分。逻辑优化主要是基于规则的优化,简称 RBO(rule based optimization)。物理优化会为逻辑查询计划中的算子选择某个具体的实现,需要用到一些统计信息,决定哪一种方式代价最低,所以是基于代价的优化 CBO(cost base...
本文为 TiDB 源码阅读系列文章的第五篇,主要对 SQL Parser 功能的实现进行了讲解,内容来自社区小伙伴——马震(GitHub ID:mz1999 )的投稿。TiDB 源码阅读系列文章的撰写初衷,就是希望能与数据库研究者、爱好者进行深入交流,我们欣喜于如此短的时间内就收到了来自社区的反馈。后续,也希望有更多小伙伴加入到与 TiDB...
本文为 TiDB 源码阅读系列文章的第二篇, 第一篇文章 介绍了 TiDB 整体的架构,知道 TiDB 有哪些模块,分别是做什么的,从哪里入手比较好,哪些可以忽略,哪些需要仔细阅读。 这篇文章是一篇入门文档,难度系数比较低,其中部分内容可能大家在其他渠道已经看过,不过为了内容完整性,我们还是会放在这里。
【合集】TiDB 源码阅读系列文章 【合集】TiDB 源码阅读系列文章 (一)序 (二)初识 TiDB 源码 (三)SQL 的一生 (四)INSERT 语句概览 (五)TiDB SQL Parser 的实现 (六)Select 语句概览 (七)基于规则的优化 (八)基于代价的优化 (九)Hash Join (十)Chunk 和执行框架简介...
本文为 TiDB 源码阅读系列文章的第五篇,主要对 SQL Parser 功能的实现进行了讲解,内容来自社区小伙伴——马震(GitHub ID:mz1999 )的投稿。 TiDB 源码阅读系列文章的撰写初衷,就是希望能与数据库研究者、爱好者进行深入交流,我们欣喜于如此短的时间内就收到了来自社区的反馈。后续,也希望有更多小伙伴加入到与 ...
上篇文章介绍了用于将 binlog 同步到 MySQL / TiDB 的 Loader package,本文往回退一步,介绍 Drainer 同步到不同下游的机制。 TiDB Binlog(github.com/pingcap/tidb-binlog)用于收集 TiDB 的 binlog,并准实时同步给下游。 同步数据这一步重要操作由 Drainer 模块支持,它可以将 binlog 同步到 TiDB / MySQL /...
几种INSERT 语句的最大不同在于执行层面,这里接着 《TiDB 源码阅读系列文章(四)INSERT 语句概览》 来讲语句执行过程。不记得前面内容的同学可以返回去看原文章。 INSERT 的执行逻辑在 executor/insert.go 中。其实前面讲的前四种 INSERT 的执行逻辑都在这个文件里。这里先讲最普通的 Basic INSERT。