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

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

  1. tidb 会缓存 pd 中的region信息,如果有修改,和tikv不一致,会再查询一次.读取到最新的状态.
  2. tidb 有多个,但是 ddl owner 只有一个,最后都是在owner上做的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: