Skip to content

Commit

Permalink
Preview PR pingcap/docs-cn#17018 and this preview is triggered from c…
Browse files Browse the repository at this point in the history
  • Loading branch information
Docsite Preview Bot committed Apr 8, 2024
1 parent 8e8f0c4 commit c44ce55
Show file tree
Hide file tree
Showing 187 changed files with 29,882 additions and 0 deletions.
1 change: 1 addition & 0 deletions markdown-pages/zh/tidb/master/_docHome.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ title: PingCAP 文档中心
hide_sidebar: true
hide_commit: true
hide_leftNav: true
summary: PingCAP 文档中心为您提供丰富的操作指南和参考资料,助您轻松上手 TiDB 产品,完成数据迁移和应用开发等操作。TiDB 是一款开源分布式关系型数据库,支持在线事务处理与在线分析处理,具备水平扩容、高可用、云原生、兼容 MySQL 协议等特性。TiDB Cloud 是全托管的数据库即服务产品,让数据库部署、运维和性能调优变得轻松简单,适用于中国出海企业和开发者。此外,还提供开发者手册、免费课程、TiDB 社区、TiDB 博客等资源,欢迎贡献内容。
---

<DocHomeContainer title="PingCAP 文档中心" subTitle="欢迎来到 PingCAP 文档中心!我们为您提供了丰富的操作指南和详实的参考资料,助您轻松上手 TiDB 产品,顺利完成数据迁移和基于数据库的应用开发等操作。">
Expand Down
1 change: 1 addition & 0 deletions markdown-pages/zh/tidb/master/_index.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ title: TiDB 产品文档
aliases: ['/docs-cn/dev/','/docs-cn/','/docs-cn/stable/']
hide_sidebar: true
hide_commit: true
summary: TiDB 是 PingCAP 公司自主设计、研发的开源分布式关系型数据库。产品文档包括了 TiDB 简介、功能概览、TiFlash、快速上手 TiDB、HTAP、开发者手册概览、软硬件环境需求、使用 TiUP 部署 TiDB、数据迁移概览、运维、监控、调优、工具、TiDB 路线图、配置文件参数、命令行参数、TiDB Control、系统变量、发布历史、常见问题。
---

<LearningPathContainer platform="tidb" title="TiDB" subTitle="TiDB 是 PingCAP 公司自主设计、研发的开源分布式关系型数据库。您可以在这里查看概念介绍、操作指南、应用开发、参考等产品文档。">
Expand Down
57 changes: 57 additions & 0 deletions markdown-pages/zh/tidb/master/agg-distinct-optimization.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
---
title: Distinct 优化
aliases: ['/docs-cn/dev/agg-distinct-optimization/']
summary: 本文介绍了对于 DISTINCT 的优化,包括简单 DISTINCT 和聚合函数 DISTINCT 的优化。简单的 DISTINCT 通常会被优化成 GROUP BY 来执行。而带有 DISTINCT 的聚合函数会在 TiDB 侧单线程执行,可以通过系统变量或 TiDB 配置项控制优化器是否执行。在优化后,DISTINCT 被下推到了 Coprocessor,在 HashAgg 里新增了一个 group by 列。
---

# Distinct 优化

本文档介绍可用于 `DISTINCT` 的优化,包括简单 `DISTINCT` 和聚合函数 `DISTINCT` 的优化。

## 简单 DISTINCT

通常简单的 `DISTINCT` 会被优化成 GROUP BY 来执行。例如:

```sql
mysql> explain select DISTINCT a from t;
+--------------------------+---------+-----------+---------------+-------------------------------------------------------+
| id | estRows | task | access object | operator info |
+--------------------------+---------+-----------+---------------+-------------------------------------------------------+
| HashAgg_6 | 2.40 | root | | group by:test.t.a, funcs:firstrow(test.t.a)->test.t.a |
| └─TableReader_11 | 3.00 | root | | data:TableFullScan_10 |
| └─TableFullScan_10 | 3.00 | cop[tikv] | table:t | keep order:false, stats:pseudo |
+--------------------------+---------+-----------+---------------+-------------------------------------------------------+
3 rows in set (0.00 sec)
```

## 聚合函数 DISTINCT

通常来说,带有 `DISTINCT` 的聚合函数会单线程的在 TiDB 侧执行。使用系统变量 [`tidb_opt_distinct_agg_push_down`](/system-variables.md#tidb_opt_distinct_agg_push_down) 或者 TiDB 的配置项 [distinct-agg-push-down](/tidb-configuration-file.md#distinct-agg-push-down) 控制优化器是否执行带有 `DISTINCT` 的聚合函数(比如 `select count(distinct a) from t`)下推到 Coprocessor 的优化操作。

在以下示例中,`tidb_opt_distinct_agg_push_down` 开启前,TiDB 需要从 TiKV 读取所有数据,并在 TiDB 侧执行 `disctinct``tidb_opt_distinct_agg_push_down` 开启后,`distinct a` 被下推到了 Coprocessor,在 `HashAgg_5` 里新增了一个 `group by``test.t.a`

```sql
mysql> desc select count(distinct a) from test.t;
+-------------------------+----------+-----------+---------------+------------------------------------------+
| id | estRows | task | access object | operator info |
+-------------------------+----------+-----------+---------------+------------------------------------------+
| StreamAgg_6 | 1.00 | root | | funcs:count(distinct test.t.a)->Column#4 |
| └─TableReader_10 | 10000.00 | root | | data:TableFullScan_9 |
| └─TableFullScan_9 | 10000.00 | cop[tikv] | table:t | keep order:false, stats:pseudo |
+-------------------------+----------+-----------+---------------+------------------------------------------+
3 rows in set (0.01 sec)

mysql> set session tidb_opt_distinct_agg_push_down = 1;
Query OK, 0 rows affected (0.00 sec)

mysql> desc select count(distinct a) from test.t;
+---------------------------+----------+-----------+---------------+------------------------------------------+
| id | estRows | task | access object | operator info |
+---------------------------+----------+-----------+---------------+------------------------------------------+
| HashAgg_8 | 1.00 | root | | funcs:count(distinct test.t.a)->Column#3 |
| └─TableReader_9 | 1.00 | root | | data:HashAgg_5 |
| └─HashAgg_5 | 1.00 | cop[tikv] | | group by:test.t.a, |
| └─TableFullScan_7 | 10000.00 | cop[tikv] | table:t | keep order:false, stats:pseudo |
+---------------------------+----------+-----------+---------------+------------------------------------------+
4 rows in set (0.00 sec)
```
230 changes: 230 additions & 0 deletions markdown-pages/zh/tidb/master/basic-sql-operations.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,230 @@
---
title: SQL 基本操作
aliases: ['/docs-cn/dev/basic-sql-operations/','/docs-cn/dev/how-to/get-started/explore-sql/']
summary: TiDB 是一个兼容 MySQL 的数据库,可以执行 DDL、DML、DQL 和 DCL 操作。可以使用 SHOW DATABASES 查看数据库列表,使用 CREATE DATABASE 创建数据库,使用 DROP DATABASE 删除数据库。使用 CREATE TABLE 创建表,使用 SHOW CREATE TABLE 查看建表语句,使用 DROP TABLE 删除表。使用 CREATE INDEX 创建索引,使用 SHOW INDEX 查看表内所有索引,使用 DROP INDEX 删除索引。使用 INSERT 向表内插入记录,使用 UPDATE 修改记录,使用 DELETE 删除记录。使用 SELECT 检索表内数据,使用 WHERE 子句进行筛选。使用 CREATE USER 创建用户,使用 GRANT 授权用户,使用 DROP USER 删除用户。
---

# SQL 基本操作

成功部署 TiDB 集群之后,便可以在 TiDB 中执行 SQL 语句了。因为 TiDB 兼容 MySQL,你可以使用 MySQL 客户端连接 TiDB,并且[大多数情况下](/mysql-compatibility.md)可以直接执行 MySQL 语句。

SQL 是一门声明性语言,它是数据库用户与数据库交互的方式。它更像是一种自然语言,好像在用英语与数据库进行对话。本文档介绍基本的 SQL 操作。完整的 SQL 语句列表,参见 [TiDB SQL 语法详解](https://pingcap.github.io/sqlgram/)

## 分类

SQL 语言通常按照功能划分成以下的 4 个部分:

- DDL (Data Definition Language):数据定义语言,用来定义数据库对象,包括库、表、视图和索引等。

- DML (Data Manipulation Language):数据操作语言,用来操作和业务相关的记录。

- DQL (Data Query Language):数据查询语言,用来查询经过条件筛选的记录。

- DCL (Data Control Language):数据控制语言,用来定义访问权限和安全级别。

常用的 DDL 功能是对象(如表、索引等)的创建、属性修改和删除,对应的命令分别是 CREATE、ALTER 和 DROP。

## 查看、创建和删除数据库

TiDB 语境中的 Database 或者说数据库,可以认为是表和索引等对象的集合。

使用 `SHOW DATABASES` 语句查看系统中数据库列表:

```sql
SHOW DATABASES;
```

使用名为 `mysql` 的数据库:

```sql
USE mysql;
```

使用 `SHOW TABLES` 语句查看数据库中的所有表。例如:

```sql
SHOW TABLES FROM mysql;
```

使用 `CREATE DATABASE` 语句创建数据库。语法如下:

```sql
CREATE DATABASE db_name [options];
```

例如,要创建一个名为 `samp_db` 的数据库,可使用以下语句:

```sql
CREATE DATABASE IF NOT EXISTS samp_db;
```

添加 `IF NOT EXISTS` 可防止发生错误。

使用 `DROP DATABASE` 语句删除数据库。例如:

```sql
DROP DATABASE samp_db;
```

## 创建、查看和删除表

使用 `CREATE TABLE` 语句创建表。语法如下:

```sql
CREATE TABLE table_name column_name data_type constraint;
```

例如,要创建一个名为 `person` 的表,包括编号、名字、生日等字段,可使用以下语句:

```sql
CREATE TABLE person (
id INT(11),
name VARCHAR(255),
birthday DATE
);
```

使用 `SHOW CREATE` 语句查看建表语句,即 DDL。例如:

```sql
SHOW CREATE TABLE person;
```

使用 `DROP TABLE` 语句删除表。例如:

```sql
DROP TABLE person;
```

## 创建、查看和删除索引

索引通常用于加速索引列上的查询。对于值不唯一的列,可使用 `CREATE INDEX``ALTER TABLE` 语句创建普通索引。例如:

```sql
CREATE INDEX person_id ON person (id);
```

或者:

```sql
ALTER TABLE person ADD INDEX person_id (id);
```

对于值唯一的列,可以创建唯一索引。例如:

```sql
CREATE UNIQUE INDEX person_unique_id ON person (id);
```

或者:

```sql
ALTER TABLE person ADD UNIQUE person_unique_id (id);
```

使用 `SHOW INDEX` 语句查看表内所有索引:

```sql
SHOW INDEX FROM person;
```

使用 `ALTER TABLE``DROP INDEX` 语句来删除索引。与 `CREATE INDEX` 语句类似,`DROP INDEX` 也可以嵌入 `ALTER TABLE` 语句。例如:

```sql
DROP INDEX person_id ON person;
```

```sql
ALTER TABLE person DROP INDEX person_unique_id;
```

注意:DDL 操作不是事务,在执行 DDL 时,不需要对应 COMMIT 语句。

常用的 DML 功能是对表记录的新增、修改和删除,对应的命令分别是 INSERT、UPDATE 和 DELETE。

## 记录的增删改

使用 `INSERT` 语句向表内插入表记录。例如:

```sql
INSERT INTO person VALUES(1,'tom','20170912');
```

使用 `INSERT` 语句向表内插入包含部分字段数据的表记录。例如:

```sql
INSERT INTO person(id,name) VALUES('2','bob');
```

使用 `UPDATE` 语句向表内修改表记录的部分字段数据。例如:

```sql
UPDATE person SET birthday='20180808' WHERE id=2;
```

使用 `DELETE` 语句向表内删除部分表记录。例如:

```sql
DELETE FROM person WHERE id=2;
```

注意:UPDATE 和 DELETE 操作如果不带 WHERE 过滤条件是对全表进行操作。

DQL 数据查询语言是从一个表或多个表中检索出想要的数据行,通常是业务开发的核心内容。

## 查询数据

使用 `SELECT` 语句检索表内数据。例如:

```sql
SELECT * FROM person;
```

在 SELECT 后面加上要查询的列名。例如:

```sql
SELECT name FROM person;
```

```sql
+------+
| name |
+------+
| tom |
+------+
1 rows in set (0.00 sec)
```

使用 WHERE 子句,对所有记录进行是否符合条件的筛选后再返回。例如:

```sql
SELECT * FROM person WHERE id<5;
```

常用的 DCL 功能是创建或删除用户,和对用户权限的管理。

## 创建、授权和删除用户

使用 `CREATE USER` 语句创建一个用户 `tiuser`,密码为 `123456`

```sql
CREATE USER 'tiuser'@'localhost' IDENTIFIED BY '123456';
```

授权用户 `tiuser` 可检索数据库 `samp_db` 内的表:

```sql
GRANT SELECT ON samp_db.* TO 'tiuser'@'localhost';
```

查询用户 `tiuser` 的权限:

```sql
SHOW GRANTS for tiuser@localhost;
```

删除用户 `tiuser`

```sql
DROP USER 'tiuser'@'localhost';
```
Loading

0 comments on commit c44ce55

Please sign in to comment.