文章目录
第一部分:MySQL基础概念与架构
1.1 MySQL简介与发展历史
MySQL是一个开源的关系型数据库管理系统(RDBMS),由瑞典MySQL AB公司开发,目前属于Oracle旗下产品。MySQL以其高性能、高可靠性和易用性成为最流行的开源数据库之一。
发展历程:
- 1995年:MySQL由Michael Widenius和David Axmark创建
- 2000年:采用GPL许可协议,开源发布
- 2008年:Sun Microsystems以10亿美元收购MySQL AB
- 2010年:Oracle收购Sun,MySQL成为Oracle产品
- 2013年:MySQL 5.6发布,性能显著提升
- 2018年:MySQL 8.0发布,带来重大改进
1.2 MySQL体系架构
MySQL采用分层架构设计,主要组件包括:
-
连接层:
- 连接池管理
- 认证和权限验证
- 线程处理模型
-
服务层:
- SQL接口
- 解析器
- 查询优化器
- 缓存管理
-
存储引擎层:
- InnoDB (默认引擎)
- MyISAM
- Memory
- 其他第三方引擎
-
文件系统层:
- 日志文件
- 数据文件
- 索引文件
- 配置文件
第二部分:MySQL安装与配置
2.1 安装MySQL
Linux安装:
# Ubuntu/Debian
sudo apt update
sudo apt install mysql-server
# CentOS/RHEL
sudo yum install mysql-server
Windows安装:
- 从MySQL官网下载安装包
- 运行安装向导
- 选择安装类型和配置选项
- 设置root密码
2.2 基本配置
配置文件位置:
- Linux:
/etc/my.cnf
或/etc/mysql/my.cnf
- Windows:
C:\ProgramData\MySQL\MySQL Server X.X\my.ini
常用配置参数:
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
port=3306
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
default-storage-engine=INNODB
max_connections=200
innodb_buffer_pool_size=1G
2.3 用户与权限管理
创建用户:
CREATE USER 'username'@'host' IDENTIFIED BY 'password';
授予权限:
GRANT ALL PRIVILEGES ON database.* TO 'username'@'host';
FLUSH PRIVILEGES;
查看权限:
SHOW GRANTS FOR 'username'@'host';
第三部分:SQL语言基础
3.1 数据库操作
创建数据库:
CREATE DATABASE dbname CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
选择数据库:
USE dbname;
删除数据库:
DROP DATABASE dbname;
3.2 表操作
创建表:
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL UNIQUE,
email VARCHAR(100) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB;
修改表结构:
ALTER TABLE users ADD COLUMN age INT AFTER email;
ALTER TABLE users MODIFY COLUMN username VARCHAR(60);
ALTER TABLE users DROP COLUMN age;
3.3 数据操作语言(DML)
插入数据:
INSERT INTO users (username, email) VALUES ('john', 'john@example.com');
查询数据:
SELECT * FROM users WHERE id > 10 ORDER BY created_at DESC LIMIT 10;
更新数据:
UPDATE users SET email = 'new@example.com' WHERE id = 1;
删除数据:
DELETE FROM users WHERE id = 1;
第四部分:高级SQL技术
4.1 复杂查询
连接查询:
SELECT u.username, o.order_id, o.amount
FROM users u
JOIN orders o ON u.id = o.user_id
WHERE u.created_at > '2023-01-01';
子查询:
SELECT username FROM users WHERE id IN (SELECT user_id FROM orders WHERE amount > 100);
聚合函数:
SELECT
COUNT(*) as total_users,
AVG(age) as avg_age,
MAX(created_at) as latest_user
FROM users;
4.2 事务处理
事务基本语法:
START TRANSACTION;
INSERT INTO orders (user_id, amount) VALUES (1, 100);
UPDATE accounts SET balance = balance - 100 WHERE user_id = 1;
COMMIT;
-- 或 ROLLBACK;
事务隔离级别:
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
4.3 存储过程与函数
创建存储过程:
DELIMITER //
CREATE PROCEDURE transfer_funds(
IN from_account INT,
IN to_account INT,
IN amount DECIMAL(10,2)
BEGIN
START TRANSACTION;
UPDATE accounts SET balance = balance - amount WHERE id = from_account;
UPDATE accounts SET balance = balance + amount WHERE id = to_account;
COMMIT;
END //
DELIMITER ;
调用存储过程:
CALL transfer_funds(1, 2, 100.00);
第五部分:MySQL性能优化
5.1 索引优化
创建索引:
CREATE INDEX idx_username ON users(username);
CREATE UNIQUE INDEX idx_email ON users(email);
复合索引:
CREATE INDEX idx_name_age ON users(last_name, first_name, age);
分析索引使用:
EXPLAIN SELECT * FROM users WHERE username = 'john';
5.2 查询优化
避免全表扫描:
-- 不好的写法
SELECT * FROM users WHERE YEAR(created_at) = 2023;
-- 优化写法
SELECT * FROM users WHERE created_at BETWEEN '2023-01-01' AND '2023-12-31';
LIMIT优化:
-- 不好的写法
SELECT * FROM users LIMIT 100000, 10;
-- 优化写法
SELECT * FROM users WHERE id > 100000 LIMIT 10;
5.3 服务器优化
配置优化:
[mysqld]
innodb_buffer_pool_size = 4G # 通常设置为可用内存的70-80%
innodb_log_file_size = 256M
innodb_flush_log_at_trx_commit = 1
sync_binlog = 1
query_cache_size = 0 # MySQL 8.0已移除查询缓存
第六部分:MySQL高级特性
6.1 分区表
创建分区表:
CREATE TABLE sales (
id INT AUTO_INCREMENT,
sale_date DATE,
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 pmax VALUES LESS THAN MAXVALUE
);
管理分区:
ALTER TABLE sales ADD PARTITION (PARTITION p2023 VALUES LESS THAN (2024));
ALTER TABLE sales DROP PARTITION p2020;
6.2 视图
创建视图:
CREATE VIEW active_users AS
SELECT id, username, email
FROM users
WHERE last_login > DATE_SUB(NOW(), INTERVAL 30 DAY);
使用视图:
SELECT * FROM active_users WHERE email LIKE '%@example.com';
6.3 触发器
创建触发器:
DELIMITER //
CREATE TRIGGER before_user_update
BEFORE UPDATE ON users
FOR EACH ROW
BEGIN
SET NEW.updated_at = NOW();
END //
DELIMITER ;
第七部分:MySQL安全与备份
7.1 安全配置
基本安全措施:
- 修改root默认密码
- 删除匿名用户
- 限制远程访问
- 定期更新MySQL版本
SSL配置:
[mysqld]
ssl-ca=/etc/mysql/ca.pem
ssl-cert=/etc/mysql/server-cert.pem
ssl-key=/etc/mysql/server-key.pem
7.2 备份与恢复
mysqldump备份:
mysqldump -u root -p --all-databases > full_backup.sql
mysqldump -u root -p dbname > dbname_backup.sql
物理备份:
# 需要停止MySQL服务或锁定表
tar -czvf /backup/mysql_data.tar.gz /var/lib/mysql
二进制日志备份:
FLUSH LOGS;
PURGE BINARY LOGS BEFORE '2023-01-01 00:00:00';
第八部分:MySQL高可用与集群
8.1 主从复制
主服务器配置:
[mysqld]
server-id=1
log-bin=mysql-bin
binlog-format=ROW
从服务器配置:
[mysqld]
server-id=2
relay-log=mysql-relay-bin
read-only=1
设置复制:
-- 在主服务器上
CREATE USER 'repl'@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
-- 在从服务器上
CHANGE MASTER TO
MASTER_HOST='master_host',
MASTER_USER='repl',
MASTER_PASSWORD='password',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=123456;
START SLAVE;
8.2 MySQL Group Replication
配置Group Replication:
[mysqld]
server_id=1
gtid_mode=ON
enforce_gtid_consistency=ON
binlog_checksum=NONE
log_bin=binlog
log_slave_updates=ON
binlog_format=ROW
master_info_repository=TABLE
relay_log_info_repository=TABLE
plugin_load_add='group_replication.so'
transaction_write_set_extraction=XXHASH64
group_replication_start_on_boot=off
group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
group_replication_local_address= "192.168.1.1:33061"
group_replication_group_seeds= "192.168.1.1:33061,192.168.1.2:33061,192.168.1.3:33061"
group_replication_bootstrap_group=off
第九部分:MySQL监控与维护
9.1 性能监控
SHOW STATUS命令:
SHOW GLOBAL STATUS LIKE 'Threads_connected';
SHOW GLOBAL STATUS LIKE 'Innodb_row_lock%';
Performance Schema:
SELECT * FROM performance_schema.events_statements_summary_by_digest
ORDER BY sum_timer_wait DESC LIMIT 10;
9.2 日常维护
表维护:
ANALYZE TABLE users;
OPTIMIZE TABLE large_table;
CHECK TABLE important_table;
日志管理:
-- 查看慢查询日志
SELECT * FROM mysql.slow_log;
-- 查看错误日志
SHOW VARIABLES LIKE 'log_error';
第十部分:MySQL与其他技术集成
10.1 MySQL与应用程序集成
Python连接MySQL:
import mysql.connector
conn = mysql.connector.connect(
host="localhost",
user="username",
password="password",
database="dbname"
)
cursor = conn.cursor()
cursor.execute("SELECT * FROM users")
rows = cursor.fetchall()
conn.close()
Java连接MySQL:
import java.sql.*;
public class MySQLExample {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/dbname";
String user = "username";
String password = "password";
try (Connection conn = DriverManager.getConnection(url, user, password);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM users")) {
while (rs.next()) {
System.out.println(rs.getString("username"));
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
10.2 MySQL与大数据技术
MySQL与Hadoop集成:
# 使用Sqoop从MySQL导入数据到HDFS
sqoop import \
--connect jdbc:mysql://localhost/dbname \
--username username \
--password password \
--table users \
--target-dir /user/hadoop/users
MySQL与Spark集成:
from pyspark.sql import SparkSession
spark = SparkSession.builder.appName("MySQLExample").getOrCreate()
df = spark.read \
.format("jdbc") \
.option("url", "jdbc:mysql://localhost:3306/dbname") \
.option("dbtable", "users") \
.option("user", "username") \
.option("password", "password") \
.load()
df.show()
结语
MySQL作为世界上最流行的开源关系型数据库,其强大的功能、优异的性能和可靠性使其成为各种规模应用的理想选择。本指南涵盖了从基础到高级的MySQL开发技术,包括安装配置、SQL语言、性能优化、高级特性、安全备份、高可用集群以及与其他技术的集成。
随着技术的不断发展,MySQL也在持续演进。MySQL 8.0引入了许多新特性,如窗口函数、通用表表达式(CTE)、JSON增强功能等,进一步扩展了其应用场景。掌握MySQL开发技术对于任何数据库开发人员或后端工程师都是必不可少的技能。