跳到主要内容

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 理论)
  • 水平扩展能力强

主要类型:

  1. 键值存储(Key-Value):Redis、Memcached
  2. 文档数据库(Document):MongoDB、Couchbase
  3. 列族存储(Column-family):Cassandra、HBase
  4. 图形数据库(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;

执行顺序:

  1. FROM - 确定数据来源
  2. ON - 连接条件
  3. JOIN - 执行连接
  4. WHERE - 过滤行
  5. GROUP BY - 分组
  6. HAVING - 过滤分组
  7. SELECT - 选择列
  8. DISTINCT - 去重
  9. ORDER BY - 排序
  10. 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:

  1. 下载 MySQL Installer:https://dev.mysql.com/downloads/installer/
  2. 选择 "Custom" 安装类型
  3. 选择 MySQL Server、Workbench 等组件
  4. 配置服务端口、root 密码
  5. 完成安装并启动服务

方式二:源码编译安装

优点: 可自定义编译选项,性能优化

步骤:

# 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_connections151最大连接数500-1000
innodb_buffer_pool_size128MInnoDB 缓冲池大小物理内存的 50%-70%
innodb_log_file_size48M日志文件大小256M-1G
innodb_flush_log_at_trx_commit1事务日志刷新策略1(生产)/ 2(性能)
query_cache_size-查询缓存大小MySQL 8.0 已移除
slow_query_logOFF慢查询日志ON(生产环境)
long_query_time10慢查询阈值2
max_allowed_packet4M最大数据包大小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!';

权限管理最佳实践

  1. 最小权限原则:只授予必要的权限
  2. 限制访问来源:明确指定 host,避免使用 %
  3. 定期审计:定期检查用户权限,清理无用账号
  4. 强密码策略
    • 长度至少 8 位
    • 包含大小写字母、数字、特殊字符
    • 定期更换
  5. 应用隔离:不同应用使用不同数据库用户
-- 示例:创建应用专用用户
-- 只读用户(用于报表查询)
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):字符的比较和排序规则

常用字符集

字符集说明长度应用场景
asciiASCII 字符1 字节英文环境
latin1Latin-1 西欧字符1 字节西欧语言
gbk中文GBK编码2 字节中文环境(旧系统)
utf8UTF-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_ciUnicode 标准,不区分大小写较慢多语言场景
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;

最佳实践

  1. 统一使用 utf8mb4:服务器、数据库、表、连接统一使用
  2. 应用层也要统一:确保应用程序、数据库连接、数据库本身字符集一致
  3. 选择合适的排序规则
    • 一般场景:utf8mb4_unicode_ci
    • 用户名等需区分大小写:utf8mb4_bin
  4. 避免字符集转换:字符集转换会导致性能问题和乱码风险
  5. 测试 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 的数据类型,包括整数类型、浮点类型、字符串类型、日期时间类型等,以及如何正确选择数据类型。