作者介绍:简历上没有一个精通的运维工程师,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。

数据库是一个系统(应用)最重要的资产之一,所以我们的数据库将从以下几个数据库来进行介绍。
MySQL(本章节)
PostgreSQL
Redis
Etcd
主键是数据库表设计中最为重要的概念之一,它远不止是“唯一标识符”那么简单,尤其是在 MySQL 默认的 InnoDB 存储引擎中。
主键是数据库表中的一个或多个字段(列),它的值用于唯一地标识表中的某一条记录。
打个比方:身份证号是中国公民在主表“人口数据库”中的主键,每个人的身份证号都是唯一且不为空的,通过它可以精准地定位到一个人。
理解 InnoDB 的聚簇索引结构是理解主键的关键。
GEN_CLUST_INDEX 的 6 字节的行 ID(rowid)作为聚簇索引。这个行 ID 是单调递增的。重要结论:在 InnoDB 中,每个表都必须有且仅有一个聚簇索引,而主键就是默认的聚簇索引。
现代数据库设计实践中,绝大多数推荐使用代理主键,尤其是使用 AUTO_INCREMENT 的自增整数。
INT/BIGINT 类型占用空间小,比较速度快。自增特性保证了新数据总是顺序追加到当前 B+Tree 的末尾,写入效率高,几乎不会造成页分裂。UUID_TO_BIN(... , 1))或将其作为业务键,另设一个自增 INT 作为主键。主键可以由多个字段组合而成。
user_role 表,有 user_id 和 role_id 两个字段,其组合可以唯一确定一条记录。PRIMARY KEY (user_id, role_id)。建议:除非有非常明确的理由(如上述中间表),否则尽量使用单一的代理主键。
六、相关命令
复合主键
CREATE TABLE order_items (
order_id INT NOT NULL,
product_id INT NOT NULL,
quantity INT NOT NULL,
PRIMARY KEY (order_id, product_id) -- 指定 (order_id, product_id) 为联合主键
);ALTER TABLE table_name
ADD PRIMARY KEY (column_name);查看主键,实际是查看表结构创建命令,就可以看到。
mysql> SHOW CREATE TABLE test_data;
+-----------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-----------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| test_data | CREATE TABLE `test_data` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`value` varchar(255) DEFAULT NULL,
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`random_number` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_test_data_value` (`value`)
) ENGINE=InnoDB AUTO_INCREMENT=8437687 DEFAULT CHARSET=latin1 |
+-----------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)