From 807cce7bfd6d3699737debac8ec4596860dcb880 Mon Sep 17 00:00:00 2001 From: JoyinQin <56883733+Joyinqin@users.noreply.github.com> Date: Wed, 29 Jul 2020 23:36:57 +0800 Subject: [PATCH 1/8] faq, sql-statements: update out of date info --- sql-statements/sql-statement-set-variable.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/sql-statements/sql-statement-set-variable.md b/sql-statements/sql-statement-set-variable.md index 34b05af1fc27..0ef4addcdd39 100644 --- a/sql-statements/sql-statement-set-variable.md +++ b/sql-statements/sql-statement-set-variable.md @@ -129,7 +129,11 @@ SHOW SESSION VARIABLES LIKE 'sql_mode'; ## MySQL 兼容性 -`SET [GLOBAL|SESSION]` 语句与 MySQL 完全兼容。如有任何兼容性差异,请在 GitHub 上提交 [issue](/report-issue.md)。 +以下表现差异适用于: + +* 集群中的所有 TiDB 实例会获取 `SET GLOBAL` 所做的更改。这点与 MySQL 不同,在 MySQL 中的更改不会应用到副本。 +* TiDB 提供了几个既可读又可设置,同时是 MySQL 兼容性必需的变量。因为通常都是应用程序和连接器读取 MySQL 变量。例如:尽管不依赖表现差异,JDBC 连接器会同时读取和设置缓存查询。 +* 在 TiDB 服务器中,`SET GLOBAL` 的更改即使重启后也仍然有效。相当于 TiDB 中的 `SET GLOBAL` 与 MySQL 8.0 及更高版本中的 `SET PERSIST`设置更加类似。 ## 另请参阅 From def935ff31302cd7d860d63db10b575b3b058b66 Mon Sep 17 00:00:00 2001 From: JoyinQin <56883733+Joyinqin@users.noreply.github.com> Date: Wed, 29 Jul 2020 23:37:07 +0800 Subject: [PATCH 2/8] Update sql-faq.md --- faq/sql-faq.md | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/faq/sql-faq.md b/faq/sql-faq.md index 5e29e3962166..91f4c11e7207 100644 --- a/faq/sql-faq.md +++ b/faq/sql-faq.md @@ -11,9 +11,11 @@ summary: 介绍 SQL 操作相关的常见问题。 详细可参考[系统变量](/system-variables.md)。 -## TiDB 是否支持 select for update? +## TiDB 是否支持 `SELECT FOR UPDATE`? -支持,但语义上和 MySQL 有区别,TiDB 是分布式数据库,3.0.8 版本前,采用的乐观锁机制,也就说 select for update 不在事务开启就锁住数据,而是其他事务在提交的时候进行冲突检查,如有冲突,会进行回滚。3.0.8 版本之后,默认采用悲观锁机制,行为和 MySQL 基本一致,SELECT FOR UPDATE 会读取已提交的最新数据,并对读取到的数据加悲观锁。 +支持。当 TiDB 使用悲观锁(TiDB v3.0 以来的默认设置)时,它的行为与 MySQL 基本一致。 + +当使用乐观锁时,`SELECT FOR UPDATE` 不会在事务启动时锁定数据,而是在提交事务时检查冲突。如果显示冲突,则提交的事务会进行回滚。 ## TiDB 的 codec 能保证 UTF8 的字符串是 memcomparable 的吗?我们的 key 需要支持 UTF8,有什么编码建议吗? @@ -25,11 +27,11 @@ TiDB 字符集默认就是 UTF8 而且目前只支持 UTF8,字符串就是 mem ## 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)。 -## sql_mode 默认除了通过命令 set 修改,配置文件怎么修改? +## 如何在 TiDB 中修改 `sql_mode`? -TiDB 的 sql_mode 与 MySQL 的 sql_mode 设置方法有一些差别,TiDB 不支持配置文件配置设置数据库的 sql\_mode,而只能使用 set 命令去设置,具体方法为:`set @@global.sql_mode = 'STRICT_TRANS_TABLES';`。 +TiDB 支持将 [`sql_mode`](/docs-cn/sql-mode.md) 修改为[系统变量](/doc-cn/system-variables.md#sql_mode),就像 MySQL 中一样。目前,TiDB 不允许在配置文件中修改 sql_mode,但是集群中的所有 TiDB server 会获取到使用 [`SET GLOBAL`](/docs-cn/sql-statements/sql-statement-set-variable.md) 进行的系统变量更改,并且重启后依然有效。 ## 用 Sqoop 批量写入 TiDB 数据,虽然配置了 `--batch` 选项,但还是会遇到 `java.sql.BatchUpdateExecption:statement count 5001 exceeds the transaction limitation` 的错误,该如何解决? @@ -48,7 +50,7 @@ TiDB 的 sql_mode 与 MySQL 的 sql_mode 设置方法有一些差别,TiDB 不 --batch ``` -- 也可以选择增大 tidb 的单个事物语句数量限制,不过这个会导致内存上涨。 +- 也可以选择增大 TiDB 的单个事物语句数量限制,不过此操作会导致内存上涨。 ## TiDB 有像 Oracle 那样的 Flashback Query 功能么,DDL 支持么? @@ -58,9 +60,9 @@ TiDB 的 sql_mode 与 MySQL 的 sql_mode 设置方法有一些差别,TiDB 不 DELETE,TRUNCATE 和 DROP 都不会立即释放空间。对于 TRUNCATE 和 DROP 操作,在达到 TiDB 的 GC (garbage collection) 时间后(默认 10 分钟),TiDB 的 GC 机制会删除数据并释放空间。对于 DELETE 操作 TiDB 的 GC 机制会删除数据,但不会释放空间,而是当后续数据写入 RocksDB 且进行 compact 时对空间重新利用。 -## TiDB 是否支持 replace into 语法? +## TiDB 是否支持 `REPLACE INTO` 语法? -支持,但是 load data 不支持 replace into 语法。 +支持,例外情况是 `LOAD DATA` 当前不支持 `REPLACE INTO` 语法。 ## 数据删除后查询速度为何会变慢? @@ -68,11 +70,11 @@ DELETE,TRUNCATE 和 DROP 都不会立即释放空间。对于 TRUNCATE 和 DRO ## 对数据做删除操作之后,空间回收比较慢,如何处理? -可以设置并行 GC,加快对空间的回收速度。默认并发为 1,最大可调整为 tikv 实例数量的 50%。可使用 `update mysql.tidb set VARIABLE_VALUE="3" where VARIABLE_NAME="tikv_gc_concurrency";` 命令来调整。 +可以设置并行 GC,加快对空间的回收速度。默认并发为 1,最大可调整为 TiKV 实例数量的 50%。可使用 `update mysql.tidb set VARIABLE_VALUE="3" where VARIABLE_NAME="tikv_gc_concurrency";` 命令来调整。 -## show processlist 是否显示系统进程号? +## `SHOW PROCESSLIST` 是否显示系统进程号? -TiDB 的 `show processlist` 与 MySQL 的 `show processlist` 显示内容基本一样,不会显示系统进程号,而 ID 表示当前的 session ID。其中 TiDB 的 `show processlist` 和 MySQL 的 `show processlist` 区别如下: +TiDB 的 `SHOW PROCESSLIST` 与 MySQL 的 `SHOW PROCESSLIST` 显示内容基本一样,不会显示系统进程号,而 ID 表示当前的 session ID。其中 TiDB 的 `show processlist` 和 MySQL 的 `show processlist` 区别如下: + 由于 TiDB 是分布式数据库,TiDB server 实例是无状态的 SQL 解析和执行引擎(详情可参考 [TiDB 整体架构](/tidb-architecture.md)),用户使用 MySQL 客户端登录的是哪个 TiDB server ,`show processlist` 就会显示当前连接的这个 TiDB server 中执行的 session 列表,不是整个集群中运行的全部 session 列表;而 MySQL 是单机数据库,`show processlist` 列出的是当前整个 MySQL 数据库的全部执行 SQL 列表。 @@ -107,9 +109,9 @@ TiDB 支持改变 [per-session](/system-variables.md#tidb_force_priority)、[全 当表的(修改数/当前总行数)大于 `tidb_auto_analyze_ratio` 的时候,会自动触发 `analyze` 语句。`tidb_auto_analyze_ratio` 的默认值为 0.5,即默认开启此功能。为了保险起见,在开启此功能的时候,保证了其最小值为 0.3。但是不能大于等于 `pseudo-estimate-ratio`(默认值为 0.8),否则会有一段时间使用 pseudo 统计信息,建议设置值为 0.5。 -## SQL 中如何通过 hint 使用一个具体的 index? +## 可以使用 hints 控制优化器行为吗? -同 MySQL 的用法一致,例如: +TiDB 支持多种方法控制默认查询优化器的行为,包括 [Optimizer Hints](/docs-cn/optimizer-hints.md) 和 [SQL 执行管理](/docs-cn/sql-plan-management.md)。基本用法同 MySQL 中一致,并且包含 TiDB 特定扩展名: `select column_name from table_name use index(index_name)where where_condition;` ## 触发 Information schema is changed 错误的原因? @@ -161,6 +163,7 @@ Count 就是暴力扫表,提高并发度能显著的提升速度,修改并 - 提升并发度,默认是 10,可以提升到 50 试试,但是一般提升在 2-4 倍之间。 - 测试大数据量的 count。 - 调优 TiKV 配置,可以参考[性能调优](/tune-tikv-memory-performance.md)。 +- 可以参考[下推计算结果缓存](/docs-cn/coprocessor-cache.md)。 ### 查看当前 DDL 的进度? From 8992fbd78b15d0475be01975ecf1c531a8203985 Mon Sep 17 00:00:00 2001 From: JoyinQ <56883733+Joyinqin@users.noreply.github.com> Date: Wed, 29 Jul 2020 23:55:54 +0800 Subject: [PATCH 3/8] Update sql-faq.md --- faq/sql-faq.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/faq/sql-faq.md b/faq/sql-faq.md index 91f4c11e7207..09b226276be2 100644 --- a/faq/sql-faq.md +++ b/faq/sql-faq.md @@ -31,7 +31,7 @@ TiDB 的自增 ID (`AUTO_INCREMENT`) 只保证自增且唯一,并不保证连 ## 如何在 TiDB 中修改 `sql_mode`? -TiDB 支持将 [`sql_mode`](/docs-cn/sql-mode.md) 修改为[系统变量](/doc-cn/system-variables.md#sql_mode),就像 MySQL 中一样。目前,TiDB 不允许在配置文件中修改 sql_mode,但是集群中的所有 TiDB server 会获取到使用 [`SET GLOBAL`](/docs-cn/sql-statements/sql-statement-set-variable.md) 进行的系统变量更改,并且重启后依然有效。 +TiDB 支持将 [`sql_mode`](/sql-mode.md) 修改为[系统变量](/system-variables.md#sql_mode),就像 MySQL 中一样。目前,TiDB 不允许在配置文件中修改 sql_mode,但是集群中的所有 TiDB server 会获取到使用 [`SET GLOBAL`](/sql-statements/sql-statement-set-variable.md) 进行的系统变量更改,并且重启后依然有效。 ## 用 Sqoop 批量写入 TiDB 数据,虽然配置了 `--batch` 选项,但还是会遇到 `java.sql.BatchUpdateExecption:statement count 5001 exceeds the transaction limitation` 的错误,该如何解决? @@ -85,7 +85,7 @@ TiDB 的 `SHOW PROCESSLIST` 与 MySQL 的 `SHOW PROCESSLIST` 显示内容基 TiDB 支持改变 [per-session](/system-variables.md#tidb_force_priority)、[全局](/tidb-configuration-file.md#force-priority)或单个语句的优先级。优先级包括: - HIGH_PRIORITY:该语句为高优先级语句,TiDB 在执行阶段会优先处理这条语句 -- LOW_PRIORITY:该语句为低优先级语句,TiDB 在执行阶段会降低这条语句的优先级 +- LOW_PRIORITY:该语句为低优\先级语句,TiDB 在执行阶段会降低这条语句的优先级 以上两种参数可以结合 TiDB 的 DML 语言进行使用,使用方法举例如下: @@ -111,7 +111,7 @@ TiDB 支持改变 [per-session](/system-variables.md#tidb_force_priority)、[全 ## 可以使用 hints 控制优化器行为吗? -TiDB 支持多种方法控制默认查询优化器的行为,包括 [Optimizer Hints](/docs-cn/optimizer-hints.md) 和 [SQL 执行管理](/docs-cn/sql-plan-management.md)。基本用法同 MySQL 中一致,并且包含 TiDB 特定扩展名: +TiDB 支持多种方法控制默认查询优化器的行为,包括 [Optimizer Hints](/optimizer-hints.md) 和 [SQL 执行管理](/sql-plan-management.md)。基本用法同 MySQL 中一致,并且包含 TiDB 特定扩展名: `select column_name from table_name use index(index_name)where where_condition;` ## 触发 Information schema is changed 错误的原因? @@ -163,7 +163,7 @@ Count 就是暴力扫表,提高并发度能显著的提升速度,修改并 - 提升并发度,默认是 10,可以提升到 50 试试,但是一般提升在 2-4 倍之间。 - 测试大数据量的 count。 - 调优 TiKV 配置,可以参考[性能调优](/tune-tikv-memory-performance.md)。 -- 可以参考[下推计算结果缓存](/docs-cn/coprocessor-cache.md)。 +- 可以参考[下推计算结果缓存](/coprocessor-cache.md)。 ### 查看当前 DDL 的进度? From 4467eae94cb603a514a8759d6ed5207b8084aaf6 Mon Sep 17 00:00:00 2001 From: JoyinQin <56883733+Joyinqin@users.noreply.github.com> Date: Thu, 30 Jul 2020 09:51:59 +0800 Subject: [PATCH 4/8] change some expressions --- faq/sql-faq.md | 20 ++++++++++---------- sql-statements/sql-statement-set-variable.md | 6 +++--- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/faq/sql-faq.md b/faq/sql-faq.md index d8d2db36cf3c..f6b05a88624d 100644 --- a/faq/sql-faq.md +++ b/faq/sql-faq.md @@ -13,9 +13,9 @@ summary: 介绍 SQL 操作相关的常见问题。 ## TiDB 是否支持 `SELECT FOR UPDATE`? -支持。当 TiDB 使用悲观锁(TiDB v3.0 以来的默认设置)时,它的行为与 MySQL 基本一致。 +支持。当 TiDB 使用悲观锁(TiDB v3.0 以来的默认设置)时,`SELECT FOR UPDATE` 表现与 MySQL 中基本一致。 -当使用乐观锁时,`SELECT FOR UPDATE` 不会在事务启动时锁定数据,而是在提交事务时检查冲突。如果显示冲突,则提交的事务会进行回滚。 +当 TiDB 使用乐观锁时,`SELECT FOR UPDATE` 不会在事务启动时锁定数据,而是在提交事务时检查冲突。如果显示冲突,则提交的事务会进行回滚。 ## TiDB 的 codec 能保证 UTF8 的字符串是 memcomparable 的吗?我们的 key 需要支持 UTF8,有什么编码建议吗? @@ -31,7 +31,7 @@ TiDB 的自增 ID (`AUTO_INCREMENT`) 只保证自增且唯一,并不保证连 ## 如何在 TiDB 中修改 `sql_mode`? -TiDB 支持将 [`sql_mode`](/sql-mode.md) 修改为[系统变量](/system-variables.md#sql_mode),就像 MySQL 中一样。目前,TiDB 不允许在配置文件中修改 sql_mode,但是集群中的所有 TiDB server 会获取到使用 [`SET GLOBAL`](/sql-statements/sql-statement-set-variable.md) 进行的系统变量更改,并且重启后依然有效。 +TiDB 支持将 [`sql_mode`](/sql-mode.md) 修改为[系统变量](/system-variables.md#sql_mode),操作与 MySQL 中一致。目前,TiDB 不允许在配置文件中修改 `sql_mode`,但是集群中的所有 TiDB server 会获取到使用 [`SET GLOBAL`](/sql-statements/sql-statement-set-variable.md) 进行的系统变量更改,并且重启后更改依然有效。 ## 用 Sqoop 批量写入 TiDB 数据,虽然配置了 `--batch` 选项,但还是会遇到 `java.sql.BatchUpdateExecption:statement count 5001 exceeds the transaction limitation` 的错误,该如何解决? @@ -85,7 +85,7 @@ TiDB 的 `SHOW PROCESSLIST` 与 MySQL 的 `SHOW PROCESSLIST` 显示内容基 TiDB 支持改变 [per-session](/system-variables.md#tidb_force_priority)、[全局](/tidb-configuration-file.md#force-priority)或单个语句的优先级。优先级包括: - HIGH_PRIORITY:该语句为高优先级语句,TiDB 在执行阶段会优先处理这条语句 -- LOW_PRIORITY:该语句为低优\先级语句,TiDB 在执行阶段会降低这条语句的优先级 +- LOW_PRIORITY:该语句为低优先级语句,TiDB 在执行阶段会降低这条语句的优先级 以上两种参数可以结合 TiDB 的 DML 语言进行使用,使用方法举例如下: @@ -109,9 +109,9 @@ TiDB 支持改变 [per-session](/system-variables.md#tidb_force_priority)、[全 当表的(修改数/当前总行数)大于 `tidb_auto_analyze_ratio` 的时候,会自动触发 `analyze` 语句。`tidb_auto_analyze_ratio` 的默认值为 0.5,即默认开启此功能。为了保险起见,在开启此功能的时候,保证了其最小值为 0.3。但是不能大于等于 `pseudo-estimate-ratio`(默认值为 0.8),否则会有一段时间使用 pseudo 统计信息,建议设置值为 0.5。 -## 可以使用 hints 控制优化器行为吗? +## 可以使用 Hints 控制优化器行为吗? -TiDB 支持多种方法控制默认查询优化器的行为,包括 [Optimizer Hints](/optimizer-hints.md) 和 [SQL 执行管理](/sql-plan-management.md)。基本用法同 MySQL 中一致,并且包含 TiDB 特定扩展名: +TiDB 支持多种方法以控制默认查询优化器行为,包括 [Optimizer Hints](/optimizer-hints.md) 和 [SQL 执行管理](/sql-plan-management.md)。基本用法同 MySQL 中一致,并且包含 TiDB 特定扩展名: `select column_name from table_name use index(index_name)where where_condition;` ## 触发 Information schema is changed 错误的原因? @@ -147,11 +147,11 @@ TiDB 在执行 SQL 语句时,会使用当时的 `schema` 来处理该 SQL 语 ### TiDB 执行计划解读 -详细解读 [理解 TiDB 执行计划](/query-execution-plan.md)。 +详细解读[理解 TiDB 执行计划](/query-execution-plan.md)。 ### 统计信息收集 -详细解读 [统计信息](/statistics.md)。 +详细解读[统计信息](/statistics.md)。 ### Count 如何加速? @@ -216,8 +216,8 @@ ID 没什么规律,只要是唯一就行,不过生成的时候,是有一 ### 如何打散热点 -TiDB 中以 Region 分片来管理数据库,通常来讲,TiDB 的热点指的是 Region 的读写访问热点。而 TiDB 中对于非整数主键或没有主键的表,可以通过设置 `SHARD_ROW_ID_BITS` 来适度分解 Region 分片,以达到打散 Region 热点的效果。详情可参考官网 [SHARD_ROW_ID_BITS](/shard-row-id-bits.md)中的介绍。 +TiDB 中以 Region 分片来管理数据库,通常来讲,TiDB 的热点指的是 Region 的读写访问热点。而 TiDB 中对于非整数主键或没有主键的表,可以通过设置 `SHARD_ROW_ID_BITS` 来适度分解 Region 分片,以达到打散 Region 热点的效果。详情可参考官网 [SHARD_ROW_ID_BITS](/shard-row-id-bits.md) 中的介绍。 ### TiKV 性能参数调优 -详情参考 [TiKV 性能参数调优](/tune-tikv-memory-performance.md)。 +详情参考 [TiKV 性能参数调优](/tune-tikv-memory-performance.md)。 \ No newline at end of file diff --git a/sql-statements/sql-statement-set-variable.md b/sql-statements/sql-statement-set-variable.md index 0ef4addcdd39..cf026ac08c9e 100644 --- a/sql-statements/sql-statement-set-variable.md +++ b/sql-statements/sql-statement-set-variable.md @@ -129,11 +129,11 @@ SHOW SESSION VARIABLES LIKE 'sql_mode'; ## MySQL 兼容性 -以下表现差异适用于: +TiDB 与 MySQL 兼容性方面的表现差异: * 集群中的所有 TiDB 实例会获取 `SET GLOBAL` 所做的更改。这点与 MySQL 不同,在 MySQL 中的更改不会应用到副本。 -* TiDB 提供了几个既可读又可设置,同时是 MySQL 兼容性必需的变量。因为通常都是应用程序和连接器读取 MySQL 变量。例如:尽管不依赖表现差异,JDBC 连接器会同时读取和设置缓存查询。 -* 在 TiDB 服务器中,`SET GLOBAL` 的更改即使重启后也仍然有效。相当于 TiDB 中的 `SET GLOBAL` 与 MySQL 8.0 及更高版本中的 `SET PERSIST`设置更加类似。 +* TiDB 提供了几个既可读又可设置,同时是 MySQL 兼容性必需的变量。因为通常都是应用程序和连接器读取 MySQL 变量。例如:尽管不依赖兼容性差异,JDBC 连接器会同时读取和设置缓存查询。 +* 在 TiDB 服务器中,`SET GLOBAL` 的更改即使重启后也仍然有效。也就是 TiDB 中的 `SET GLOBAL` 与 MySQL 8.0 及更高版本中的 `SET PERSIST`设置更加类似。 ## 另请参阅 From 4c87ac2f0e454301f9f39a2227af1874b1fbcfc7 Mon Sep 17 00:00:00 2001 From: JoyinQin <56883733+Joyinqin@users.noreply.github.com> Date: Sat, 1 Aug 2020 17:08:04 +0800 Subject: [PATCH 5/8] update details --- faq/sql-faq.md | 2 +- sql-statements/sql-statement-set-variable.md | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/faq/sql-faq.md b/faq/sql-faq.md index f6b05a88624d..927f95e240fd 100644 --- a/faq/sql-faq.md +++ b/faq/sql-faq.md @@ -62,7 +62,7 @@ DELETE,TRUNCATE 和 DROP 都不会立即释放空间。对于 TRUNCATE 和 DRO ## TiDB 是否支持 `REPLACE INTO` 语法? -支持,例外情况是 `LOAD DATA` 当前不支持 `REPLACE INTO` 语法。 +支持,例外是当前 `LOAD DATA` 不支持 `REPLACE INTO` 语法。 ## 数据删除后查询速度为何会变慢? diff --git a/sql-statements/sql-statement-set-variable.md b/sql-statements/sql-statement-set-variable.md index cf026ac08c9e..d597203be7e9 100644 --- a/sql-statements/sql-statement-set-variable.md +++ b/sql-statements/sql-statement-set-variable.md @@ -129,11 +129,11 @@ SHOW SESSION VARIABLES LIKE 'sql_mode'; ## MySQL 兼容性 -TiDB 与 MySQL 兼容性方面的表现差异: +以下为 TiDB 与 MySQL 兼容性方面的表现差异,适用于: -* 集群中的所有 TiDB 实例会获取 `SET GLOBAL` 所做的更改。这点与 MySQL 不同,在 MySQL 中的更改不会应用到副本。 -* TiDB 提供了几个既可读又可设置,同时是 MySQL 兼容性必需的变量。因为通常都是应用程序和连接器读取 MySQL 变量。例如:尽管不依赖兼容性差异,JDBC 连接器会同时读取和设置缓存查询。 -* 在 TiDB 服务器中,`SET GLOBAL` 的更改即使重启后也仍然有效。也就是 TiDB 中的 `SET GLOBAL` 与 MySQL 8.0 及更高版本中的 `SET PERSIST`设置更加类似。 +* 与 MySQL 不同,集群中的全部 TiDB 实例会获取 `SET GLOBAL` 所做的更改。而在 MySQL 中的更改不会应用到副本。 +* TiDB 提供了一些既可读又可设置,同时是 MySQL 兼容性必需的变量。因为通常都是由应用程序和连接器读取 MySQL 变量。例如:尽管不依赖兼容性差异,JDBC 连接器会同时读取和设置缓存查询。 +* 即使在 TiDB 服务器重启后,`SET GLOBAL` 的更改也仍然有效。即 TiDB 中的 `SET GLOBAL` 表现与 MySQL 8.0 及更高版本中的 `SET PERSIST` 设置更加类似。 ## 另请参阅 From 35604d9b58c3499ba02cdfc42fc6af95c82c5370 Mon Sep 17 00:00:00 2001 From: JoyinQ <56883733+Joyinqin@users.noreply.github.com> Date: Wed, 5 Aug 2020 15:38:54 +0800 Subject: [PATCH 6/8] Apply suggestions from code review Co-authored-by: TomShawn <41534398+TomShawn@users.noreply.github.com> --- faq/sql-faq.md | 12 ++++++------ sql-statements/sql-statement-set-variable.md | 8 ++++---- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/faq/sql-faq.md b/faq/sql-faq.md index 927f95e240fd..9bec81499882 100644 --- a/faq/sql-faq.md +++ b/faq/sql-faq.md @@ -13,9 +13,9 @@ summary: 介绍 SQL 操作相关的常见问题。 ## TiDB 是否支持 `SELECT FOR UPDATE`? -支持。当 TiDB 使用悲观锁(TiDB v3.0 以来的默认设置)时,`SELECT FOR UPDATE` 表现与 MySQL 中基本一致。 +支持。当 TiDB 使用悲观锁(自 TiDB v3.0 起默认使用)时,TiDB 中 `SELECT FOR UPDATE` 的行为与 MySQL 中的基本一致。 -当 TiDB 使用乐观锁时,`SELECT FOR UPDATE` 不会在事务启动时锁定数据,而是在提交事务时检查冲突。如果显示冲突,则提交的事务会进行回滚。 +当 TiDB 使用乐观锁时,`SELECT FOR UPDATE` 不会在事务启动时对数据加锁,而是在提交事务时检查冲突。如果检查出冲突,会回滚待提交的事务。 ## TiDB 的 codec 能保证 UTF8 的字符串是 memcomparable 的吗?我们的 key 需要支持 UTF8,有什么编码建议吗? @@ -31,7 +31,7 @@ TiDB 的自增 ID (`AUTO_INCREMENT`) 只保证自增且唯一,并不保证连 ## 如何在 TiDB 中修改 `sql_mode`? -TiDB 支持将 [`sql_mode`](/sql-mode.md) 修改为[系统变量](/system-variables.md#sql_mode),操作与 MySQL 中一致。目前,TiDB 不允许在配置文件中修改 `sql_mode`,但是集群中的所有 TiDB server 会获取到使用 [`SET GLOBAL`](/sql-statements/sql-statement-set-variable.md) 进行的系统变量更改,并且重启后更改依然有效。 +TiDB 支持将 [`sql_mode`](/sql-mode.md) 作为[系统变量](/system-variables.md#sql_mode)修改,与 MySQL 一致。目前,TiDB 不支持在配置文件中修改 `sql_mode`,但使用 [`SET GLOBAL`](/sql-statements/sql-statement-set-variable.md) 对系统变量的修改将应用于集群中的所有 TiDB server,并且重启后更改依然有效。 ## 用 Sqoop 批量写入 TiDB 数据,虽然配置了 `--batch` 选项,但还是会遇到 `java.sql.BatchUpdateExecption:statement count 5001 exceeds the transaction limitation` 的错误,该如何解决? @@ -50,7 +50,7 @@ TiDB 支持将 [`sql_mode`](/sql-mode.md) 修改为[系统变量](/system-variab --batch ``` -- 也可以选择增大 TiDB 的单个事物语句数量限制,不过此操作会导致内存上涨。 +- 也可以选择增大 TiDB 的单个事物语句数量限制,不过此操作会导致内存增加。 ## TiDB 有像 Oracle 那样的 Flashback Query 功能么,DDL 支持么? @@ -74,7 +74,7 @@ DELETE,TRUNCATE 和 DROP 都不会立即释放空间。对于 TRUNCATE 和 DRO ## `SHOW PROCESSLIST` 是否显示系统进程号? -TiDB 的 `SHOW PROCESSLIST` 与 MySQL 的 `SHOW PROCESSLIST` 显示内容基本一样,不会显示系统进程号,而 ID 表示当前的 session ID。其中 TiDB 的 `show processlist` 和 MySQL 的 `show processlist` 区别如下: +TiDB 的 `SHOW PROCESSLIST` 与 MySQL 的 `SHOW PROCESSLIST` 显示内容基本一样,不会显示系统进程号,而 ID 表示当前的 session ID。其中 TiDB 的 `show processlist` 和 MySQL 的 `show processlist` 区别如下: + 由于 TiDB 是分布式数据库,TiDB server 实例是无状态的 SQL 解析和执行引擎(详情可参考 [TiDB 整体架构](/tidb-architecture.md)),用户使用 MySQL 客户端登录的是哪个 TiDB server ,`show processlist` 就会显示当前连接的这个 TiDB server 中执行的 session 列表,不是整个集群中运行的全部 session 列表;而 MySQL 是单机数据库,`show processlist` 列出的是当前整个 MySQL 数据库的全部执行 SQL 列表。 @@ -220,4 +220,4 @@ TiDB 中以 Region 分片来管理数据库,通常来讲,TiDB 的热点指 ### TiKV 性能参数调优 -详情参考 [TiKV 性能参数调优](/tune-tikv-memory-performance.md)。 \ No newline at end of file +详情参考 [TiKV 性能参数调优](/tune-tikv-memory-performance.md)。 diff --git a/sql-statements/sql-statement-set-variable.md b/sql-statements/sql-statement-set-variable.md index d597203be7e9..c224a3c4268e 100644 --- a/sql-statements/sql-statement-set-variable.md +++ b/sql-statements/sql-statement-set-variable.md @@ -129,11 +129,11 @@ SHOW SESSION VARIABLES LIKE 'sql_mode'; ## MySQL 兼容性 -以下为 TiDB 与 MySQL 兼容性方面的表现差异,适用于: +使用 `SET [GLOBAL|SESSION] ` 更改系统变量上,TiDB 与 MySQL 存在以下差异 -* 与 MySQL 不同,集群中的全部 TiDB 实例会获取 `SET GLOBAL` 所做的更改。而在 MySQL 中的更改不会应用到副本。 -* TiDB 提供了一些既可读又可设置,同时是 MySQL 兼容性必需的变量。因为通常都是由应用程序和连接器读取 MySQL 变量。例如:尽管不依赖兼容性差异,JDBC 连接器会同时读取和设置缓存查询。 -* 即使在 TiDB 服务器重启后,`SET GLOBAL` 的更改也仍然有效。即 TiDB 中的 `SET GLOBAL` 表现与 MySQL 8.0 及更高版本中的 `SET PERSIST` 设置更加类似。 +* 与 MySQL 不同,TiDB 中使用 `SET GLOBAL` 所作的修改会应用于集群中的全部 TiDB 实例。而在 MySQL 中,修改不会应用于副本。 +* TiDB 中的若干变量可读又可设置,这是与 MySQL 相兼容的要求,因为应用程序和连接器常读取 MySQL 变量。例如:JDBC 连接器同时读取和设置缓存查询的参数,尽管并不依赖这一行为。 +* 即使在 TiDB 服务器重启后,`SET GLOBAL` 的更改也仍然有效。这样,TiDB 中的 `SET GLOBAL` 更类似于 MySQL 8.0 及更高版本中的 `SET PERSIST`。 ## 另请参阅 From 602757171eecac02ffabb44d4d827722d6cd4a7f Mon Sep 17 00:00:00 2001 From: JoyinQ <56883733+Joyinqin@users.noreply.github.com> Date: Thu, 6 Aug 2020 10:08:51 +0800 Subject: [PATCH 7/8] Apply suggestions from code review Co-authored-by: TomShawn <41534398+TomShawn@users.noreply.github.com> --- faq/sql-faq.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/faq/sql-faq.md b/faq/sql-faq.md index 9bec81499882..fb559fefb606 100644 --- a/faq/sql-faq.md +++ b/faq/sql-faq.md @@ -109,9 +109,9 @@ TiDB 支持改变 [per-session](/system-variables.md#tidb_force_priority)、[全 当表的(修改数/当前总行数)大于 `tidb_auto_analyze_ratio` 的时候,会自动触发 `analyze` 语句。`tidb_auto_analyze_ratio` 的默认值为 0.5,即默认开启此功能。为了保险起见,在开启此功能的时候,保证了其最小值为 0.3。但是不能大于等于 `pseudo-estimate-ratio`(默认值为 0.8),否则会有一段时间使用 pseudo 统计信息,建议设置值为 0.5。 -## 可以使用 Hints 控制优化器行为吗? +## 可以使用 Hints 覆盖优化器行为吗? -TiDB 支持多种方法以控制默认查询优化器行为,包括 [Optimizer Hints](/optimizer-hints.md) 和 [SQL 执行管理](/sql-plan-management.md)。基本用法同 MySQL 中一致,并且包含 TiDB 特定扩展名: +在 TiDB 中,你可以用多种方法覆盖查询优化器的默认行为,包括使用 [Optimizer Hints](/optimizer-hints.md) 和 [SQL 执行计划管理 (SPM)](/sql-plan-management.md)。基本用法同 MySQL 中的一致,还包含若干 TiDB 特有的用法,示例如下 : `select column_name from table_name use index(index_name)where where_condition;` ## 触发 Information schema is changed 错误的原因? From 32c3c43b87400cc0c3b153307f1ab7ae9eb23de0 Mon Sep 17 00:00:00 2001 From: JoyinQ <56883733+Joyinqin@users.noreply.github.com> Date: Tue, 11 Aug 2020 11:06:51 +0800 Subject: [PATCH 8/8] Update sql-faq.md --- faq/sql-faq.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/faq/sql-faq.md b/faq/sql-faq.md index c1dcc535fbad..8a8773c59cbf 100644 --- a/faq/sql-faq.md +++ b/faq/sql-faq.md @@ -110,9 +110,9 @@ TiDB 支持改变 [per-session](/system-variables.md#tidb_force_priority)、[全 当表的(修改数/当前总行数)大于 `tidb_auto_analyze_ratio` 的时候,会自动触发 `analyze` 语句。`tidb_auto_analyze_ratio` 的默认值为 0.5,即默认开启此功能。为了保险起见,在开启此功能的时候,保证了其最小值为 0.3。但是不能大于等于 `pseudo-estimate-ratio`(默认值为 0.8),否则会有一段时间使用 pseudo 统计信息,建议设置值为 0.5。 -## 可以使用 Hints 覆盖优化器行为吗? +## 可以使用 Hints 控制优化器行为吗? -在 TiDB 中,你可以用多种方法覆盖查询优化器的默认行为,包括使用 [Optimizer Hints](/optimizer-hints.md) 和 [SQL 执行计划管理 (SPM)](/sql-plan-management.md)。基本用法同 MySQL 中的一致,还包含若干 TiDB 特有的用法,示例如下 : +在 TiDB 中,你可以用多种方法控制查询优化器的默认行为,包括使用 [Optimizer Hints](/optimizer-hints.md) 和 [SQL 执行计划管理 (SPM)](/sql-plan-management.md)。基本用法同 MySQL 中的一致,还包含若干 TiDB 特有的用法,示例如下 : `select column_name from table_name use index(index_name)where where_condition;` ## 触发 Information schema is changed 错误的原因?