From b84c1b68854f6c7082ac4b09d785d6a0cc41b27e Mon Sep 17 00:00:00 2001 From: JoyinQ <56883733+Joyinqin@users.noreply.github.com> Date: Wed, 12 Aug 2020 12:26:00 +0800 Subject: [PATCH] cherry pick #4248 to release-3.0 Signed-off-by: ti-srebot --- faq/tidb-faq.md | 24 +++++++++++--------- sql-statements/sql-statement-set-variable.md | 6 ++++- 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/faq/tidb-faq.md b/faq/tidb-faq.md index 27efe60be3d5..d3c953dc45fe 100755 --- a/faq/tidb-faq.md +++ b/faq/tidb-faq.md @@ -83,9 +83,11 @@ TiDB 事务模型灵感源自 Google Percolator 模型,主体是一个两阶 详细可参考[系统变量](/system-variables.md)。 -#### 1.1.15 TiDB 是否支持 select for update? +#### 1.1.15 TiDB 是否支持 `SELECT FOR UPDATE`? -支持,但语义上和 MySQL 有区别,TiDB 是分布式数据库,采用的乐观锁机制,也就说 select for update 不在事务开启就锁住数据,而是其他事务在提交的时候进行冲突检查,如有冲突,会进行回滚。 +支持。当 TiDB 使用悲观锁(自 TiDB v3.0 起默认使用)时,TiDB 中 `SELECT FOR UPDATE` 的行为与 MySQL 中的基本一致。 + +当 TiDB 使用乐观锁时,`SELECT FOR UPDATE` 不会在事务启动时对数据加锁,而是在提交事务时检查冲突。如果检查出冲突,会回滚待提交的事务。 #### 1.1.16 TiDB 的 codec 能保证 UTF8 的字符串是 memcomparable 的吗?我们的 key 需要支持 UTF8,有什么编码建议吗? @@ -121,11 +123,11 @@ TiDB 作为分布式数据库,在 TiDB 中修改用户密码建议使用 `set #### 1.1.22 TiDB 中,为什么出现后插入数据的自增 ID 反而小? -TiDB 的自增 ID (`AUTO_INCREMENT`) 只保证自增且唯一,并不保证连续分配。TiDB 目前采用批量分配的方式,所以如果在多台 TiDB 上同时插入数据,分配的自增 ID 会不连续。当多个线程并发往不同的 tidb-server 插入数据的时候,有可能会出现后插入的数据自增 ID 小的情况。此外,TiDB允许给整型类型的字段指定 AUTO_INCREMENT,且一个表只允许一个属性为 `AUTO_INCREMENT` 的字段。详情可参考[CREATE TABLE 语法](/mysql-compatibility.md#自增-id)。 +TiDB 的自增 ID (`AUTO_INCREMENT`) 只保证自增且唯一,并不保证连续分配。TiDB 目前采用批量分配的方式,所以如果在多台 TiDB 上同时插入数据,分配的自增 ID 会不连续。当多个线程并发往不同的 TiDB-server 插入数据的时候,有可能会出现后插入的数据自增 ID 小的情况。此外,TiDB 允许给整型类型的字段指定 AUTO_INCREMENT,且一个表只允许一个属性为 `AUTO_INCREMENT` 的字段。详情可参考[CREATE TABLE 语法](/mysql-compatibility.md#自增-id)。 -#### 1.1.23 sql_mode 默认除了通过命令 set 修改,配置文件怎么修改? +#### 1.1.23 如何在 TiDB 中修改 `sql_mode`? -TiDB 的 sql_mode 与 MySQL 的 sql_mode 设置方法有一些差别,TiDB 不支持配置文件配置设置数据库的 sql\_mode,而只能使用 set 命令去设置,具体方法为:`set @@global.sql_mode = 'STRICT_TRANS_TABLES';`。 +TiDB 支持将 [`sql_mode`](/sql-mode.md) 作为[系统变量](/system-variables.md)修改,与 MySQL 一致。目前,TiDB 不支持在配置文件中修改 `sql_mode`,但使用 [`SET GLOBAL`](/sql-statements/sql-statement-set-variable.md) 对系统变量的修改将应用于集群中的所有 TiDB server,并且重启后更改依然有效。 #### 1.1.23 我们的安全漏洞扫描工具对 MySQL version 有要求,TiDB 是否支持修改 server 版本号呢? @@ -569,9 +571,9 @@ TiDB 支持改变 [per-session](/tidb-specific-system-variables.md#tidb_force_pr 当表的(修改数/当前总行数)大于 `tidb_auto_analyze_ratio` 的时候,会自动触发 `analyze` 语句。`tidb_auto_analyze_ratio` 的默认值为 0.5,即默认开启此功能。为了保险起见,在开启此功能的时候,保证了其最小值为 0.3。但是不能大于等于 `pseudo-estimate-ratio`(默认值为 0.8),否则会有一段时间使用 pseudo 统计信息,建议设置值为 0.5。 -#### 3.3.12 SQL 中如何通过 hint 使用一个具体的 index? +#### 3.3.12 可以使用 Hints 控制优化器行为吗? -同 MySQL 的用法一致,例如: +在 TiDB 中,你可以用多种方法控制查询优化器的默认行为,比如 [Optimizer Hints](/optimizer-hints.md)。基本用法同 MySQL 中的一致,还包含若干 TiDB 特有的用法,示例如下: `select column_name from table_name use index(index_name)where where_condition;` #### 3.3.13 触发 Information schema is changed 错误的原因? @@ -793,7 +795,7 @@ DB2、Oracle 到 TiDB 数据迁移(增量+全量),通常做法有: --batch ``` -- 也可以选择增大 tidb 的单个事物语句数量限制,不过这个会导致内存上涨。 +- 也可以选择增大 TiDB 的单个事物语句数量限制,不过这个会导致内存增加。 #### 4.1.9 TiDB 有像 Oracle 那样的 Flashback Query 功能么,DDL 支持么? @@ -803,7 +805,7 @@ DB2、Oracle 到 TiDB 数据迁移(增量+全量),通常做法有: #### 4.2.1 Syncer 架构 -详细参考 [解析 TiDB 在线数据同步工具 Syncer](https://pingcap.com/blog-cn/tidb-syncer/)。 +详细参考[解析 TiDB 在线数据同步工具 Syncer](https://pingcap.com/blog-cn/tidb-syncer/)。 ##### 4.2.1.1 Syncer 使用文档 @@ -904,11 +906,11 @@ DELETE,TRUNCATE 和 DROP 都不会立即释放空间。对于 TRUNCATE 和 DRO ### 5.1 TiDB 执行计划解读 -详细解读 [理解 TiDB 执行计划](/query-execution-plan.md)。 +详细解读[理解 TiDB 执行计划](/query-execution-plan.md)。 #### 5.1.1 统计信息收集 -详细解读 [统计信息](/statistics.md)。 +详细解读[统计信息](/statistics.md)。 #### 5.1.2 Count 如何加速? diff --git a/sql-statements/sql-statement-set-variable.md b/sql-statements/sql-statement-set-variable.md index ed41170594b5..cdf26117be7f 100644 --- a/sql-statements/sql-statement-set-variable.md +++ b/sql-statements/sql-statement-set-variable.md @@ -113,7 +113,11 @@ SHOW SESSION VARIABLES LIKE 'sql_mode'; ## MySQL 兼容性 -`SET [GLOBAL|SESSION]` 语句与 MySQL 完全兼容。如有任何兼容性差异,请在 GitHub 上提交 [issue](/report-issue.md)。 +使用 `SET [GLOBAL|SESSION] ` 更改系统变量上,TiDB 与 MySQL 存在以下差异: + +* 与 MySQL 不同,TiDB 中使用 `SET GLOBAL` 所作的修改会应用于集群中的全部 TiDB 实例。而在 MySQL 中,修改不会应用于副本。 +* TiDB 中的若干变量可读又可设置,这是与 MySQL 相兼容的要求,因为应用程序和连接器常读取 MySQL 变量。例如:JDBC 连接器同时读取和设置缓存查询的参数,尽管并不依赖这一行为。 +* 即使在 TiDB 服务器重启后,`SET GLOBAL` 的更改也仍然有效。这样,TiDB 中的 `SET GLOBAL` 更类似于 MySQL 8.0 及更高版本中的 `SET PERSIST`。 ## 另请参阅