Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -185,7 +185,7 @@ InnoDB 是一种索引组织表:数据的存储的逻辑顺序和索引的顺

InnoDB 是按照主键索引的顺序来组织表的

- 不要使用更新频繁的列作为主键,不适用多列主键(相当于联合索引)
- 不要使用更新频繁的列作为主键,不使用多列主键(相当于联合索引)
- 不要使用 UUID,MD5,HASH,字符串列作为主键(无法保证数据的顺序增长)
- 主键建议使用自增 ID 值

Expand Down
13 changes: 10 additions & 3 deletions docs/database/mysql/mysql-questions-01.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ head:

### 什么是关系型数据库?

顾名思义,关系型数据库(RDBMS,Relational Database Management System)就是一种建立在关系模型的基础上的数据库。关系模型表明了数据库中所存储的数据之间的联系(一对一、一对多、多对多)。
顾名思义,关系型数据库(RDB,Relational Database)就是一种建立在关系模型的基础上的数据库。关系模型表明了数据库中所存储的数据之间的联系(一对一、一对多、多对多)。

关系型数据库中,我们的数据都被存放在了各种表中(比如用户表),表中的每一行就存放着一条数据(比如一个用户的信息)。

Expand Down Expand Up @@ -511,8 +511,10 @@ InnoDB 行锁是通过对索引数据页上的记录加锁实现的,MySQL Inno
由于 MVCC 的存在,对于一般的 `SELECT` 语句,InnoDB 不会加任何锁。不过, 你可以通过以下语句显式加共享锁或排他锁。

```sql
# 共享锁
# 共享锁 可以在 MySQL 5.7 和 MySQL 8.0 中使用
SELECT ... LOCK IN SHARE MODE;
# 共享锁 可以在 MySQL 8.0 中使用
SELECT ... FOR SHARE;
# 排他锁
SELECT ... FOR UPDATE;
```
Expand Down Expand Up @@ -552,7 +554,10 @@ SELECT ... FOR UPDATE;

```sql
SELECT ... FOR UPDATE
SELECT ... LOCK IN SHARE MODE
# 共享锁 可以在 MySQL 5.7 和 MySQL 8.0 中使用
SELECT ... LOCK IN SHARE MODE;
# 共享锁 可以在 MySQL 8.0 中使用
SELECT ... FOR SHARE;
```

快照即记录的历史版本,每行记录可能存在多个历史版本(多版本技术)。
Expand All @@ -575,6 +580,8 @@ SELECT ... LOCK IN SHARE MODE
SELECT...FOR UPDATE
# 对读的记录加一个S锁
SELECT...LOCK IN SHARE MODE
# 对读的记录加一个S锁
SELECT...FOR SHARE
# 对修改的记录加一个X锁
INSERT...
UPDATE...
Expand Down
6 changes: 3 additions & 3 deletions docs/database/sql/sql-questions-01.md
Original file line number Diff line number Diff line change
Expand Up @@ -192,7 +192,7 @@ ORDER BY vend_name DESC
| 运算符 | 描述 |
| :------ | :--------------------------------------------------------- |
| = | 等于 |
| <> | 不等于。**注释:**在 SQL 的一些版本中,该操作符可被写成 != |
| <> | 不等于。 **注释:** 在 SQL 的一些版本中,该操作符可被写成 != |
| > | 大于 |
| < | 小于 |
| >= | 大于等于 |
Expand Down Expand Up @@ -358,7 +358,7 @@ WHERE prod_id IN ('BR01', 'BR02', 'BR03') AND quantity >= 100
```sql
SELECT prod_name, prod_price
FROM Products
WHERE prod_price BETWEEN 3 AND 6
WHERE prod_price >= 3 and prod_price <= 6
ORDER BY prod_price
```

Expand Down Expand Up @@ -1337,7 +1337,7 @@ ORDER BY c.cust_name,o.order_num

这是错误的!只对 `cust_name` 进行聚类确实符合题意,但是不符合 `GROUP BY` 的语法。

select 语句中,如果没有 `GROUP BY` 语句,那么 `cust_name`、`order_num` 会返回若干个值,而 `sum(quantity _ item_price)` 只返回一个值,通过 `group by` `cust_name` 可以让 `cust_name` 和 `sum(quantity _ item_price)` 一一对应起来,或者说**聚类**,所以同样的,也要对 `order_num` 进行聚类。
select 语句中,如果没有 `GROUP BY` 语句,那么 `cust_name`、`order_num` 会返回若干个值,而 `sum(quantity * item_price)` 只返回一个值,通过 `group by` `cust_name` 可以让 `cust_name` 和 `sum(quantity * item_price)` 一一对应起来,或者说**聚类**,所以同样的,也要对 `order_num` 进行聚类。

> **一句话,select 中的字段要么都聚类,要么都不聚类**

Expand Down
2 changes: 1 addition & 1 deletion docs/database/sql/sql-syntax-summary.md
Original file line number Diff line number Diff line change
Expand Up @@ -556,7 +556,7 @@ SELECT column_name(s) FROM table2;
| `LEFT()`、`RIGHT()` | 左边或者右边的字符 |
| `LOWER()`、`UPPER()` | 转换为小写或者大写 |
| `LTRIM()`、`RTRIM()` | 去除左边或者右边的空格 |
| `LENGTH()` | 长度 |
| `LENGTH()` | 长度,以字节为单位 |
| `SOUNDEX()` | 转换为语音值 |

其中, **`SOUNDEX()`** 可以将一个字符串转换为描述其语音表示的字母数字模式。
Expand Down