执行dml的时候,schema信息怎么获取?

根据TiDB的文档,可以看到每个表的一行数据,最后都编码成一个kv存放到TiKV。
那么在编码的时候,我们需要获取表的索引ID和列ID,用于编码。
我想问的就是如何获取表的索引ID和列ID呢,是每次都需要通过rpc,去TiKV上查询一次?还是在每一个TiDB实例有一个缓存,只需要本地查询就可以了,那么有ddl的时候,这个缓存的一致性是怎么保证的呢?

  1. tidb 会缓存 pd 中的region信息,如果有修改,和tikv不一致,会再查询一次.读取到最新的状态.
  2. tidb 有多个,但是 ddl owner 只有一个,最后都是在owner上做的ddl变更,进一步了解可以报名学习

https://university.pingcap.com/courses/PCTP/chapter/TiDB-计算内核体系/lesson/DDL-原理

这个地方有个就有个问题了。如果drop column之后,再add column,列名都一样。
那你说的第一点这种方法是不是就不行了?

你好,

收钱 tidb 不支持 alter table 中有多个变更语句。其次 tidb 的每一个 ddl version 都持久化在 tikv 中,所以无论是否为同列 ddl,只要他的状态已经变更了,那接下来的 ddl 就会读取到最新的 ddl 信息。

对于同表的 ddl ,tidb 目前是串行执行的。

举个例子,在两个alter语句中,先后执行drop column和add column。再然后出现读写数据的请求,那么这个时候,多个TiDB实例之间怎么感知schema变化并更新schema cache呢?

如果column的名字没有变,类型也没有变,之前drop的column数据是不是还有效。

如果column的名字没有变,但是类型变了。假设一个insert 请求发到另一个tidb实例,那么在tidb编码成kv的时候,直接用老的schema进行编码(我看博客,没提到编码后的kv带了schema version信息),然后下发到tikv,那tikv上怎么可以感知到这个kv的编码是不符合新的schema的呢?

不会同时执行,会有先后顺序。 建议您可以先查看下浏览官方文档和博客了解下,多谢。

我的意思不是同时执行。比如在一个tidb上执行alter table drop aa,执行完了以后,我再执行alter table add aa int。你说的同时执行我理解是说这两个ddl会串行地运行吧,这个我在文档已经看到了

我的这个问题貌似和是否串行无关。我的问题是,你这两个ddl都执行完了之后,怎么同时tidb的其他实例schema cache更新了。

pd会通知schema版本变更, tidb会定期加载和更新shcema信息。

通知更新也会有时间差。那么会不会出现某个tidb实例还没有更新schema,然后收到了一个insert的请求呢?这个时候tikv是通过什么判断出来这个insert的数据schema版本是旧的呢?

你好

ddl 变更的过程中,tidb online ddl 会有多个状态,在每个状态发生变更时, tidb-server 完全加载后才进行下一步的变更.

感谢,我先学习下

:slightly_smiling_face: