MySQL 基础入门
第1章 数据库基础概念
1.1 数据库与数据库管理系统
什么是数据库
数据库(Database)是按照数据结构来组织、存储和管理数据的仓库,它是一个长期存储在计算机内的、有组织的、可共享的、统一管理的数据集合。
什么是数据库管理系统
数据库管理系统(DBMS,Database Management System)是用于管理、操纵和检索数据库的计算机软件系统。它位于用户与操作系统之间,提供数据定义、数据操作、数据维护和数据控制等功能。
常见的 DBMS 包括:
- 关系型数据库:MySQL、Oracle、SQL Server、PostgreSQL、SQLite
- 非关系型数据库:MongoDB、Redis、Elasticsearch、Cassandra
1.2 关系型数据库与非关系型数据库对比
关系型数据库(RDBMS)
特点:
- 基于关系模型,使用二维表(Table)存储数据
- 遵循 ACID 原则(原子性、一致性、隔离性、持久性)
- 使用 SQL(Structured Query Language)作为标准查询语言
- 支持复杂的事务处理和关联查询
- 数据结构清晰,易于理解和维护
优势:
- 数据一致性高
- 支持复杂查询
- 成熟稳定,生态完善
- 适合结构化数据和事务性操作
劣势:
- 扩展性相对有限(垂直扩展为主)
- 海量数据下性能下降
- 表结构变更较复杂
典型应用场景:
- 金融交易系统
- 企业资源管理(ERP)
- 电子商务订单系统
- 需要强一致性的业务系统
非关系型数据库(NoSQL)
特点:
- 不使用传统的关系模型
- 支持多种数据模型(键值对、文档、列族、图形)
- 放弃强一致性,追求高性能和高可用性(BASE 理论)
- 水平扩展能力强
主要类型:
- 键值存储(Key-Value):Redis、Memcached
- 文档数据库(Document):MongoDB、Couchbase
- 列族存储(Column-family):Cassandra、HBase
- 图形数据库(Graph):Neo4j、ArangoDB
优势:
- 高性能、高并发
- 水平扩展容易
- 灵活的数据模型
- 适合海量数据存储
劣势:
- 缺乏强一致性
- 查询功能相对简单
- 事务支持有限
- 标准化程度低
典型应用场景:
- 缓存系统(Redis)
- 内容管理系统(MongoDB)
- 日志存储与分析(Elasticsearch)
- 实时大数据处理(Cassandra)
对比总结表
| 特性 | 关系型数据库 | 非关系型数据库 |
|---|---|---|
| 数据模型 | 结构化表格 | 灵活(键值、文档等) |
| 查询语言 | SQL | 专有 API / 类 SQL |
| 事务支持 | 完整 ACID | 有限或无 |
| 扩展方式 | 垂直扩展为主 | 水平扩展为主 |
| 数据一致性 | 强一致性 | 最终一致性 |
| 适用场景 | 结构化数据、事务系统 | 大数据、高并发、敏捷开发 |
| 复杂度 | 较高 | 较低 |
1.3 SQL 语言分类
SQL(Structured Query Language)是结构化查询语言,用于管理关系型数据库。SQL 语句可以分为以下几类:
DDL(Data Definition Language)数据定义语言
用于定义或修改数据库的结构。
| 语句 | 功能 | 示例 |
|---|---|---|
CREATE | 创建数据库对象 | CREATE DATABASE, CREATE TABLE |
ALTER | 修改数据库对象 | ALTER TABLE ADD COLUMN |
DROP | 删除数据库对象 | DROP TABLE, DROP DATABASE |
TRUNCATE | 删除表数据但保留表结构 | TRUNCATE TABLE users |
RENAME | 重命名数据库对象 | RENAME TABLE old TO new |
-- 示例:创建表
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) NOT NULL,
email VARCHAR(100) UNIQUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 示例:修改表结构
ALTER TABLE users ADD COLUMN age INT;
ALTER TABLE users MODIFY COLUMN username VARCHAR(100);
-- 示例:删除表
DROP TABLE IF EXISTS users;
DML(Data Manipulation Language)数据操作语言
用于对数据库表中的数据进行增、删、改操作。
| 语句 | 功能 | 示例 |
|---|---|---|
INSERT | 插入新数据 | INSERT INTO users VALUES (...) |
UPDATE | 更新现有数据 | UPDATE users SET age = 25 |
DELETE | 删除数据 | DELETE FROM users WHERE id = 1 |
-- 示例:插入数据
INSERT INTO users (username, email) VALUES ('zhangsan', 'zhangsan@example.com');
-- 示例:更新数据
UPDATE users SET age = 26 WHERE username = 'zhangsan';
-- 示例:删除数据
DELETE FROM users WHERE id = 1;
DQL(Data Query Language)数据查询语言
用于从数据库中查询数据。
| 语句 | 功能 | 示例 |
|---|---|---|
SELECT | 查询数据 | SELECT * FROM users |
-- 示例:基础查询
SELECT * FROM users;
-- 示例:条件查询
SELECT username, email FROM users WHERE age > 18;
-- 示例:排序与限制
SELECT * FROM users ORDER BY created_at DESC LIMIT 10;
-- 示例:聚合查询
SELECT COUNT(*) FROM users WHERE age >= 18;
DCL(Data Control Language)数据控制语言
用于定义数据库的访问权限和安全级别。
| 语句 | 功能 | 示例 |
|---|---|---|
GRANT | 授予用户权限 | GRANT SELECT ON db.* TO 'user'@'localhost' |
REVOKE | 撤销用户权限 | REVOKE ALL PRIVILEGES ON db.* FROM 'user'@'localhost' |
-- 示例:创建用户并授权
CREATE USER 'dev_user'@'localhost' IDENTIFIED BY 'password123';
GRANT SELECT, INSERT, UPDATE ON blog_db.* TO 'dev_user'@'localhost';
-- 示例:撤销权限
REVOKE INSERT, UPDATE ON blog_db.* FROM 'dev_user'@'localhost';
-- 示例:刷新权限
FLUSH PRIVILEGES;
TCL(Transaction Control Language)事务控制语言
用于管理数据库事务。
| 语句 | 功能 | 示例 |
|---|---|---|
COMMIT | 提交事务 | COMMIT; |
ROLLBACK | 回滚事务 | ROLLBACK; |
SAVEPOINT | 设置保存点 | SAVEPOINT sp1; |
SET TRANSACTION | 设置事务隔离级别 | SET TRANSACTION ISOLATION LEVEL READ COMMITTED |
-- 示例:事务处理
START TRANSACTION;
UPDATE account SET balance = balance - 1000 WHERE id = 1;
UPDATE account SET balance = balance + 1000 WHERE id = 2;
-- 如果操作成功,提交事务
COMMIT;
-- 如果出现错误,回滚事务
-- ROLLBACK;
-- 示例:使用保存点
START TRANSACTION;
INSERT INTO users VALUES (1, 'Alice');
SAVEPOINT sp1;
INSERT INTO users VALUES (2, 'Bob');
-- ROLLBACK TO sp1; -- 回滚到保存点,只保留 Alice
COMMIT;
SQL 语句执行优先级
SELECT DISTINCT
column1, AGG_FUNC(column2)
FROM
table1
JOIN
table2 ON table1.id = table2.id
WHERE
condition
GROUP BY
column1
HAVING
group_condition
ORDER BY
column1 DESC
LIMIT
10;
执行顺序:
FROM- 确定数据来源ON- 连接条件JOIN- 执行连接WHERE- 过滤行GROUP BY- 分组HAVING- 过滤分组SELECT- 选择列DISTINCT- 去重ORDER BY- 排序LIMIT- 限制结果集
第2章 MySQL 安装与配置
2.1 安装方式
方式一:二进制包安装(推荐)
优点: 官方编译,稳定可靠,安装快速
Linux(CentOS/RHEL):
# 1. 下载 MySQL YUM Repository
wget https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
# 2. 安装 YUM Repository
sudo rpm -ivh mysql80-community-release-el7-3.noarch.rpm
# 3. 安装 MySQL
sudo yum install mysql-community-server -y
# 4. 启动 MySQL 服务
sudo systemctl start mysqld
sudo systemctl enable mysqld
# 5. 获取临时密码
sudo grep 'temporary password' /var/log/mysqld.log
# 6. 登录并修改密码
mysql -uroot -p
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPassword123!';
Linux(Ubuntu/Debian):
# 1. 更新包索引
sudo apt update
# 2. 安装 MySQL Server
sudo apt install mysql-server -y
# 3. 安全配置
sudo mysql_secure_installation
# 4. 启动服务
sudo systemctl start mysql
sudo systemctl enable mysql
Windows:
- 下载 MySQL Installer:https://dev.mysql.com/downloads/installer/
- 选择 "Custom" 安装类型
- 选择 MySQL Server、Workbench 等组件
- 配置服务端口、root 密码
- 完成安装并启动服务
方式二:源码编译安装
优点: 可自定义编译选项,性能优化
步骤:
# 1. 安装依赖
sudo yum install -y cmake gcc-c++ ncurses-devel bison
# 2. 下载源码
wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.xx.tar.gz
tar -zxvf mysql-8.0.xx.tar.gz
cd mysql-8.0.xx
# 3. 编译安装
mkdir build && cd build
cmake .. \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_DATADIR=/usr/local/mysql/data \
-DSYSCONFDIR=/etc \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_PARTITION_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_READLINE=1 \
-DENABLED_LOCAL_INFILE=1 \
-DDEFAULT_CHARSET=utf8mb4 \
-DDEFAULT_COLLATION=utf8mb4_general_ci \
-DMYSQL_UNIX_ADDR=/tmp/mysql.sock
make && make install
# 4. 初始化数据库
cd /usr/local/mysql
bin/mysqld --initialize --user=mysql
# 5. 启动 MySQL
bin/mysqld_safe --user=mysql &
方式三:Docker 安装(开发环境)
优点: 环境隔离,快速部署,便于管理
# 1. 拉取 MySQL 镜像
docker pull mysql:8.0
# 2. 运行 MySQL 容器
docker run --name mysql-server \
-e MYSQL_ROOT_PASSWORD=yourpassword \
-p 3306:3306 \
-v /data/mysql-data:/var/lib/mysql \
-v /data/mysql-conf:/etc/mysql/conf.d \
--restart unless-stopped \
-d mysql:8.0
# 3. 查看容器状态
docker ps
# 4. 进入容器
docker exec -it mysql-server mysql -uroot -p
# 5. 停止和启动容器
docker stop mysql-server
docker start mysql-server
Docker Compose 配置示例:
version: '3.8'
services:
mysql:
image: mysql:8.0
container_name: mysql-server
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: rootpassword123
MYSQL_DATABASE: blog_db
MYSQL_USER: dev_user
MYSQL_PASSWORD: userpassword123
ports:
- "3306:3306"
volumes:
- mysql-data:/var/lib/mysql
- ./mysql-conf.cnf:/etc/mysql/conf.d/custom.cnf
command: --default-authentication-plugin=mysql_native_password
volumes:
mysql-data:
2.2 配置文件 my.cnf 详解
MySQL 配置文件位置:
- Linux:
/etc/my.cnf或/etc/mysql/my.cnf - Windows:
C:\ProgramData\MySQL\MySQL Server 8.0\my.ini
配置文件结构
[client]
port = 3306
socket = /tmp/mysql.sock
default-character-set = utf8mb4
[mysqld]
###########################################
# 基础配置
###########################################
port = 3306
socket = /tmp/mysql.sock
datadir = /var/lib/mysql
pid-file = /var/run/mysqld/mysqld.pid
user = mysql
###########################################
# 字符集配置
###########################################
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect = 'SET NAMES utf8mb4'
###########################################
# 网络配置
###########################################
max_connections = 500
max_connect_errors = 1000
back_log = 512
interactive_timeout = 28800
wait_timeout = 28800
###########################################
# 缓存配置
###########################################
# InnoDB 缓冲池大小(建议设置为物理内存的 50%-70%)
innodb_buffer_pool_size = 2G
innodb_buffer_pool_instances = 8
# 查询缓存(MySQL 8.0 已移除)
# query_cache_size = 128M
# query_cache_type = 1
# 表缓存
table_open_cache = 2000
table_definition_cache = 1400
# 临时表配置
tmp_table_size = 128M
max_heap_table_size = 128M
###########################################
# InnoDB 配置
###########################################
# 数据文件配置
innodb_data_file_path = ibdata1:1G:autoextend
# 日志文件配置
innodb_log_file_size = 512M
innodb_log_files_in_group = 3
innodb_log_buffer_size = 16M
# 刷盘策略:0=每秒,1=每次事务(默认),2=每秒+写入系统缓存
innodb_flush_log_at_trx_commit = 1
innodb_flush_method = O_DIRECT
# IO 能力
innodb_io_capacity = 200
innodb_io_capacity_max = 2000
innodb_read_io_threads = 8
innodb_write_io_threads = 8
# 文件格式
innodb_file_per_table = 1
# 锁等待超时
innodb_lock_wait_timeout = 50
###########################################
# 日志配置
###########################################
# 错误日志
log_error = /var/log/mysql/error.log
# 慢查询日志
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2
log_queries_not_using_indexes = 1
# 二进制日志
log_bin = mysql-bin
binlog_format = ROW
expire_logs_days = 7
max_binlog_size = 100M
# 通用查询日志(开发环境可开启)
general_log = 0
general_log_file = /var/log/mysql/general.log
###########################################
# 复制配置
###########################################
server-id = 1
gtid_mode = ON
enforce_gtid_consistency = ON
log_slave_updates = 1
###########################################
# 其他配置
###########################################
# SQL 模式
sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
# 时区
default-time-zone = '+8:00'
# 开启性能监控
performance_schema = ON
关键配置参数说明
| 参数 | 默认值 | 说明 | 建议值 |
|---|---|---|---|
max_connections | 151 | 最大连接数 | 500-1000 |
innodb_buffer_pool_size | 128M | InnoDB 缓冲池大小 | 物理内存的 50%-70% |
innodb_log_file_size | 48M | 日志文件大小 | 256M-1G |
innodb_flush_log_at_trx_commit | 1 | 事务日志刷新策略 | 1(生产)/ 2(性能) |
query_cache_size | - | 查询缓存大小 | MySQL 8.0 已移除 |
slow_query_log | OFF | 慢查询日志 | ON(生产环境) |
long_query_time | 10 | 慢查询阈值 | 2 |
max_allowed_packet | 4M | 最大数据包大小 | 64M |
2.3 用户权限管理
创建用户
-- 创建用户(MySQL 8.0 推荐方式)
CREATE USER 'username'@'host' IDENTIFIED BY 'password';
-- 示例
CREATE USER 'dev_user'@'localhost' IDENTIFIED BY 'Dev@123456';
CREATE USER 'app_user'@'%' IDENTIFIED BY 'App@123456';
-- 创建用户时指定密码插件
CREATE USER 'admin_user'@'192.168.1.%'
IDENTIFIED WITH mysql_native_password BY 'Admin@123456';
host 说明:
localhost:仅本地连接192.168.1.%:指定网段%:任意主机(生产环境谨慎使用)
授予权限
-- 授予所有权限(不推荐)
GRANT ALL PRIVILEGES ON database.* TO 'user'@'host';
-- 授予特定权限
GRANT SELECT, INSERT, UPDATE ON blog_db.* TO 'dev_user'@'localhost';
-- 授予所有数据库的读取权限
GRANT SELECT ON *.* TO 'readonly_user'@'%';
-- 授予管理权限
GRANT RELOAD, PROCESS ON *.* TO 'admin'@'localhost';
-- 刷新权限
FLUSH PRIVILEGES;
权限级别:
- 全局权限:
*.*(所有数据库的所有表) - 数据库权限:
database.*(指定数据库的所有表) - 表权限:
database.table(指定表) - 列权限:
SELECT(column1, column2) ON database.table
常用权限:
| 权限 | 说明 |
|---|---|
ALL PRIVILEGES | 所有权限 |
SELECT | 查询 |
INSERT | 插入 |
UPDATE | 更新 |
DELETE | 删除 |
CREATE | 创建表/数据库 |
DROP | 删除表/数据库 |
ALTER | 修改表结构 |
INDEX | 创建索引 |
GRANT OPTION | 授予权限 |
查看和撤销权限
-- 查看用户权限
SHOW GRANTS FOR 'dev_user'@'localhost';
SHOW GRANTS FOR CURRENT_USER;
-- 撤销权限
REVOKE ALL PRIVILEGES ON blog_db.* FROM 'dev_user'@'localhost';
REVOKE SELECT, INSERT ON blog_db.* FROM 'app_user'@'%';
-- 删除用户
DROP USER 'dev_user'@'localhost';
-- 修改密码(MySQL 8.0)
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPassword123!';
权限管理最佳实践
- 最小权限原则:只授予必要的权限
- 限制访问来源:明确指定 host,避免使用
% - 定期审计:定期检查用户权限,清理无用账号
- 强密码策略:
- 长度至少 8 位
- 包含大小写字母、数字、特殊字符
- 定期更换
- 应用隔离:不同应用使用不同数据库用户
-- 示例:创建应用专用用户
-- 只读用户(用于报表查询)
CREATE USER 'report_user'@'192.168.1.100' IDENTIFIED BY 'Strong@Pass123';
GRANT SELECT ON blog_db.* TO 'report_user'@'192.168.1.100';
-- 应用用户(读写权限)
CREATE USER 'app_user'@'192.168.1.101' IDENTIFIED BY 'Strong@Pass123';
GRANT SELECT, INSERT, UPDATE, DELETE ON blog_db.* TO 'app_user'@'192.168.1.101';
-- 管理用户(DDL 权限)
CREATE USER 'admin_user'@'localhost' IDENTIFIED BY 'Strong@Pass123';
GRANT ALL PRIVILEGES ON *.* TO 'admin_user'@'localhost' WITH GRANT OPTION;
2.4 字符集与排序规则
字符集基础
字符集(Character Set):字符的编码方式 排序规则(Collation):字符的比较和排序规则
常用字符集
| 字符集 | 说明 | 长度 | 应用场景 |
|---|---|---|---|
ascii | ASCII 字符 | 1 字节 | 英文环境 |
latin1 | Latin-1 西欧字符 | 1 字节 | 西欧语言 |
gbk | 中文GBK编码 | 2 字节 | 中文环境(旧系统) |
utf8 | UTF-8 编码(不完整) | 最多 3 字节 | ❌ 不推荐 |
utf8mb4 | 完整 UTF-8 编码 | 最多 4 字节 | ✅ 推荐使用 |
重要提示: MySQL 的 utf8 字符集不是完整的 UTF-8,不支持 emoji 等字符,应使用 utf8mb4。
排序规则
命名规则: 字符集_语言_属性
ci:Case Insensitive(不区分大小写)cs:Case Sensitive(区分大小写)bin:Binary(二进制比较)
utf8mb4 常用排序规则:
| 排序规则 | 说明 | 性能 | 推荐场景 |
|---|---|---|---|
utf8mb4_general_ci | 通用排序,不区分大小写 | 较快 | 一般场景 |
utf8mb4_unicode_ci | Unicode 标准,不区分大小写 | 较慢 | 多语言场景 |
utf8mb4_bin | 二进制比较,区分大小写 | 最快 | 需要精确匹配(如用户名) |
配置字符集
1. 服务器级别配置(my.cnf):
[client]
default-character-set = utf8mb4
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect = 'SET NAMES utf8mb4'
2. 数据库级别:
-- 创建数据库时指定字符集
CREATE DATABASE blog_db
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
-- 修改数据库字符集
ALTER DATABASE blog_db
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
-- 查看数据库字符集
SHOW CREATE DATABASE blog_db;
3. 表级别:
-- 创建表时指定字符集
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50),
email VARCHAR(100)
) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 修改表字符集
ALTER TABLE users
CONVERT TO CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
-- 查看表字符集
SHOW CREATE TABLE users;
4. 列级别:
CREATE TABLE articles (
id INT PRIMARY KEY AUTO_INCREMENT,
title VARCHAR(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci,
content TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci
);
查看字符集配置
-- 查看所有字符集
SHOW CHARACTER SET;
-- 查看所有排序规则
SHOW COLLATION WHERE Charset = 'utf8mb4';
-- 查看当前字符集配置
SHOW VARIABLES LIKE 'character%';
SHOW VARIABLES LIKE 'collation%';
-- 输出示例:
-- character_set_client = utf8mb4
-- character_set_connection = utf8mb4
-- character_set_database = utf8mb4
-- character_set_results = utf8mb4
-- character_set_server = utf8mb4
-- collation_connection = utf8mb4_unicode_ci
-- collation_database = utf8mb4_unicode_ci
-- collation_server = utf8mb4_unicode_ci
字符集迁移方案
从 GBK 迁移到 UTF8MB4:
-- 1. 导出数据(指定字符集)
mysqldump --default-character-set=gbk -u root -p database_name > backup.sql
-- 2. 转换文件编码为 UTF-8
iconv -f GBK -t UTF-8 backup.sql > backup_utf8.sql
-- 3. 修改 SQL 文件中的字符集声明
# 将 GBK 替换为 utf8mb4
-- 4. 导入数据(指定字符集)
mysql --default-character-set=utf8mb4 -u root -p database_name < backup_utf8.sql
-- 或者直接在 MySQL 中转换
ALTER DATABASE database_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
最佳实践
- 统一使用 utf8mb4:服务器、数据库、表、连接统一使用
- 应用层也要统一:确保应用程序、数据库连接、数据库本身字符集一致
- 选择合适的排序规则:
- 一般场景:
utf8mb4_unicode_ci - 用户名等需区分大小写:
utf8mb4_bin
- 一般场景:
- 避免字符集转换:字符集转换会导致性能问题和乱码风险
- 测试 emoji 存储:确保系统支持 4 字节的 utf8mb4
-- 测试 emoji 存储
CREATE TABLE emoji_test (
content VARCHAR(100)
) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
INSERT INTO emoji_test VALUES ('MySQL 😊 测试');
SELECT * FROM emoji_test;
小结
本章介绍了 MySQL 的基础概念、安装配置和核心知识体系:
重点回顾:
- 理解关系型数据库与非关系型数据库的区别与适用场景
- 掌握 SQL 语言的五大分类:DDL、DML、DQL、DCL、TCL
- 熟悉 MySQL 的多种安装方式(二进制、源码、Docker)
- 掌握 my.cnf 配置文件的关键参数
- 了解用户权限管理和最小权限原则
- 正确配置字符集(推荐使用 utf8mb4)
下章预告: 下一章将学习 MySQL 的数据类型,包括整数类型、浮点类型、字符串类型、日期时间类型等,以及如何正确选择数据类型。