MySQL
MySQL 是世界上最受欢迎的开源关系型数据库之一,以其可靠性、易用性和性能著称。
特点
- 易于使用和管理
- 高性能
- 可靠性强
- 大规模数据处理能力
- 跨平台支持
安装
macOS (使用 Homebrew)
brew install mysql
brew services start mysql
基本命令
# 登录 MySQL
mysql -u root -p
# 查看数据库
SHOW DATABASES;
# 选择数据库
USE database_name;
# 查看表
SHOW TABLES;
# 查看表结构
DESCRIBE table_name;
常用 SQL 示例
1. 数据库操作
-- 创建数据库
CREATE DATABASE myapp CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 删除数据库
DROP DATABASE IF EXISTS myapp;
-- 使用数据库
USE myapp;
2. 表操作
-- 创建表
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL UNIQUE,
email VARCHAR(100) NOT NULL UNIQUE,
password_hash CHAR(60) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
status ENUM('active', 'inactive', 'banned') DEFAULT 'active',
INDEX idx_email (email),
INDEX idx_status (status)
) ENGINE=InnoDB;
-- 修改表
ALTER TABLE users
ADD COLUMN last_login TIMESTAMP NULL,
ADD COLUMN login_count INT DEFAULT 0;
-- 创建外键
CREATE TABLE posts (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
title VARCHAR(200) NOT NULL,
content TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id)
ON DELETE CASCADE
ON UPDATE CASCADE
);
3. 数据操作
-- 插入数据
INSERT INTO users (username, email, password_hash)
VALUES
('john_doe', 'john@example.com', 'hashed_password_1'),
('jane_doe', 'jane@example.com', 'hashed_password_2');
-- 批量插入
INSERT INTO posts (user_id, title, content)
SELECT
id,
CONCAT('Post by ', username),
'Sample content'
FROM users;
-- 更新数据
UPDATE users
SET status = 'inactive',
login_count = login_count + 1
WHERE id = 1;
-- 删除数据
DELETE FROM users WHERE status = 'banned';
4. 查询示例
-- 基本联接查询
SELECT
u.username,
p.title,
p.created_at
FROM users u
JOIN posts p ON u.id = p.user_id
WHERE u.status = 'active'
ORDER BY p.created_at DESC;
-- 分组统计
SELECT
status,
COUNT(*) as user_count,
MAX(created_at) as latest_user
FROM users
GROUP BY status
HAVING user_count > 5;
-- 子查询
SELECT username, email
FROM users
WHERE id IN (
SELECT DISTINCT user_id
FROM posts
WHERE created_at >= DATE_SUB(NOW(), INTERVAL 7 DAY)
);
-- 窗口函数
SELECT
username,
login_count,
RANK() OVER (ORDER BY login_count DESC) as login_rank
FROM users;
5. 事务处理
-- 开始事务
START TRANSACTION;
-- 转账操作
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
-- 提交事务
COMMIT;
-- 如果出错则回滚
ROLLBACK;
Node.js 示例
const mysql = require('mysql2/promise');
// 创建连接池
const pool = mysql.createPool({
host: 'localhost',
user: 'root',
password: 'password',
database: 'myapp',
waitForConnections: true,
connectionLimit: 10,
queueLimit: 0
});
// 查询示例
async function getUserPosts(userId) {
try {
const [rows] = await pool.query(`
SELECT u.username, p.title, p.content
FROM users u
JOIN posts p ON u.id = p.user_id
WHERE u.id = ?
`, [userId]);
return rows;
} catch (err) {
console.error('Error:', err);
throw err;
}
}
// 事务示例
async function createUserWithPosts(userData, posts) {
const connection = await pool.getConnection();
try {
await connection.beginTransaction();
// 插入用户
const [userResult] = await connection.query(
'INSERT INTO users (username, email, password_hash) VALUES (?, ?, ?)',
[userData.username, userData.email, userData.passwordHash]
);
// 插入文章
const userId = userResult.insertId;
for (const post of posts) {
await connection.query(
'INSERT INTO posts (user_id, title, content) VALUES (?, ?, ?)',
[userId, post.title, post.content]
);
}
await connection.commit();
return userId;
} catch (err) {
await connection.rollback();
throw err;
} finally {
connection.release();
}
}
性能优化技巧
- 索引优化
-- 添加复合索引
ALTER TABLE posts
ADD INDEX idx_user_created (user_id, created_at);
-- 查看索引使用情况
EXPLAIN SELECT * FROM posts
WHERE user_id = 1
AND created_at > '2023-01-01';
- 查询优化
-- 使用 EXPLAIN 分析查询
EXPLAIN FORMAT=JSON
SELECT * FROM users
WHERE email LIKE '%@example.com';
-- 优化分页查询
SELECT * FROM users u
JOIN (
SELECT id FROM users
ORDER BY created_at
LIMIT 10 OFFSET 1000000
) sub ON u.id = sub.id;
- 配置优化
-- 查看系统变量
SHOW VARIABLES LIKE 'innodb_buffer_pool_size';
-- 查看状态
SHOW STATUS LIKE 'Threads_connected';
备份和恢复
# 备份数据库
mysqldump -u root -p myapp > backup.sql
# 恢复数据库
mysql -u root -p myapp < backup.sql
# 备份特定表
mysqldump -u root -p myapp users posts > tables_backup.sql
常见问题解决
- 连接数问题
-- 查看当前连接
SHOW PROCESSLIST;
-- 查看最大连接数
SHOW VARIABLES LIKE 'max_connections';
-- 终止特定连接
KILL CONNECTION_ID;
- 死锁处理
-- 查看当前锁
SHOW ENGINE INNODB STATUS;
-- 查看死锁信息
SELECT * FROM information_schema.INNODB_TRX;
- 慢查询分析
-- 开启慢查询日志
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 2;
-- 查看慢查询
SELECT * FROM mysql.slow_log;
主从复制配置
主服务器配置
-- 在 my.cnf 中添加:
server-id = 1
log-bin = mysql-bin
-- 创建复制用户
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=0;
START SLAVE;