# 登录MySQL[root@localhost ~]# mysql -u root -p
Enter password: ******# 创建数据库
mysql> CREATE DATABASE company CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;# 创建员工表
mysql> USE company;
mysql> CREATE TABLE employees (id INT AUTO_INCREMENT PRIMARY KEY,first_name VARCHAR(50) NOT NULL,last_name VARCHAR(50) NOT NULL,email VARCHAR(100) UNIQUE,hire_date DATE NOT NULL,salary DECIMAL(10,2) DEFAULT 0.00,department_id INT,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,INDEX idx_name (first_name, last_name),FULLTEXT INDEX idx_email (email))ENGINE=InnoDB;
2. 修改表结构
# 添加新列
mysql> ALTER TABLE employees ADD COLUMN phone VARCHAR(20) AFTER email;# 修改列类型
mysql> ALTER TABLE employees MODIFY salary DECIMAL(12,2);# 删除列
mysql> ALTER TABLE employees DROP COLUMN created_at;# 重命名表
mysql> RENAME TABLE employees TO staff;
3. 查看表结构
# 查看表定义
mysql> SHOW CREATE TABLE staff\G
*************************** 1. row ***************************Table: staff
Create Table: CREATE TABLE `staff`(`id` int NOT NULL AUTO_INCREMENT,`first_name` varchar(50) NOT NULL,`last_name` varchar(50) NOT NULL,`email` varchar(100) DEFAULT NULL,`phone` varchar(20) DEFAULT NULL,`hire_date`date NOT NULL,`salary` decimal(12,2) DEFAULT '0.00',`department_id` int DEFAULT NULL,PRIMARY KEY (`id`),UNIQUE KEY `email`(`email`),KEY `idx_name`(`first_name`,`last_name`),FULLTEXT KEY `idx_email`(`email`))ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci# 查看表信息
mysql> DESCRIBE staff;
+---------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------+--------------+------+-----+---------+----------------+
|id| int | NO | PRI | NULL | auto_increment || first_name | varchar(50)| NO | MUL | NULL ||| last_name | varchar(50)| NO || NULL ||| email | varchar(100)| YES | UNI | NULL ||| phone | varchar(20)| YES || NULL ||| hire_date |date| NO || NULL ||| salary | decimal(12,2)| YES ||0.00||| department_id | int | YES || NULL ||
+---------------+--------------+------+-----+---------+----------------+
二、键值操作演示
1. 主键管理
# 创建表时定义主键
mysql> CREATE TABLE departments (dept_id INT PRIMARY KEY,dept_name VARCHAR(100) NOT NULL
);# 添加主键
mysql> ALTER TABLE staff ADD PRIMARY KEY (id);# 删除主键
mysql> ALTER TABLE staff DROP PRIMARY KEY;
2. 外键约束
# 添加外键约束
mysql> ALTER TABLE staff ADD CONSTRAINT fk_deptFOREIGN KEY (department_id) REFERENCES departments(dept_id)ON DELETE SET NULL ON UPDATE CASCADE;# 查看外键
mysql> SELECT TABLE_NAME, COLUMN_NAME, CONSTRAINT_NAME, REFERENCED_TABLE_NAMEFROM INFORMATION_SCHEMA.KEY_COLUMN_USAGEWHERE REFERENCED_TABLE_NAME ='departments';
3. 索引管理
# 创建普通索引
mysql> CREATE INDEX idx_hire_date ON staff(hire_date);# 创建唯一索引
mysql> CREATE UNIQUE INDEX uniq_email ON staff(email);# 创建全文索引
mysql> CREATE FULLTEXT INDEX ft_idx_name ON staff(first_name, last_name);# 删除索引
mysql> DROP INDEX idx_hire_date ON staff;
4. 索引使用分析
# 查看索引使用
mysql> EXPLAIN SELECT * FROM staff WHERE last_name ='Smith';
+----+-------------+-------+------------+------+---------------+----------+---------+-------+------+----------+-------------+
|id| select_type | table | partitions |type| possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------+----------+---------+-------+------+----------+-------------+
|1| SIMPLE | staff| NULL | ref | idx_name | idx_name |152| const |1|100.00| Using where |
+----+-------------+-------+------------+------+---------------+----------+---------+-------+------+----------+-------------+# 强制使用索引
mysql> SELECT * FROM staff FORCE INDEX (idx_name) WHERE first_name ='John';
索引设计矩阵
索引类型
单列索引
复合索引
覆盖索引
前缀索引
最佳实践
创建语法
INDEX (col)
INDEX (col1,col2)
包含所有查询列
INDEX (col(10))
按查询模式设计
适用场景
等值查询
范围查询+排序
只读查询
长文本字段
组合查询:复合索引
索引大小
小
中等
大
小
空间敏感:前缀索引
查询速度
快
快
最快
中等
性能优先:覆盖索引
更新代价
低
中
高
低
写密集:单列索引
使用限制
无
最左前缀原则
列数限制
部分匹配
遵循最左前缀原则
三、高级表结构操作
1. 分区表
# 创建范围分区表
mysql> CREATE TABLE sales (id INT AUTO_INCREMENT,sale_date DATE NOT NULL,amount DECIMAL(10,2),PRIMARY KEY (id, sale_date)) PARTITION BY RANGE (YEAR(sale_date))(PARTITION p2020 VALUES LESS THAN (2021),PARTITION p2021 VALUES LESS THAN (2022),PARTITION p2022 VALUES LESS THAN (2023),PARTITION p2023 VALUES LESS THAN MAXVALUE
);# 添加分区
mysql> ALTER TABLE sales ADD PARTITION (PARTITION p2024 VALUES LESS THAN (2025));
2. 生成列
# 创建虚拟生成列
mysql> ALTER TABLE staff ADD full_name VARCHAR(100) GENERATED ALWAYS AS (CONCAT(first_name, ' ', last_name)) VIRTUAL;# 查询使用
mysql> SELECT full_name FROM staff WHERE id=1;
+-----------------+
| full_name |
+-----------------+
| John Smith |
+-----------------+
3. JSON 数据类型
# 创建JSON列
mysql> ALTER TABLE staff ADD profile JSON;# 插入JSON数据
mysql> UPDATE staff SET profile ='{"skills": ["MySQL", "PHP"], "experience": 5}' WHERE id=1;# 查询JSON字段
mysql> SELECT profile->"$.skills[0]" AS primary_skill FROM staff;
+---------------+
| primary_skill |
+---------------+
|"MySQL"|
+---------------+
命令总结表格
演示命令
功能描述
关键参数
CREATE TABLE t (id INT PRIMARY KEY)
创建表
列定义、键值
ALTER TABLE t ADD COLUMN c VARCHAR(50)
添加列
列名和类型
ALTER TABLE t ADD PRIMARY KEY (id)
添加主键
主键列
ALTER TABLE t ADD CONSTRAINT fk FOREIGN KEY (c) REFERENCES t2(c2)
添加外键
约束名、关联表
CREATE INDEX idx ON t(c)
创建索引
索引名、列
DROP INDEX idx ON t
删除索引
索引名
SHOW CREATE TABLE t\G
查看表结构
\G 格式化输出
EXPLAIN SELECT ...
分析查询
查看索引使用
ALTER TABLE t PARTITION BY RANGE (c) (...)
创建分区
分区类型和规则
ALTER TABLE t ADD COLUMN c GENERATED ALWAYS AS (expr) VIRTUAL