-- 创建用户表 CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULLUNIQUE, email VARCHAR(100) NOT NULLUNIQUE, password VARCHAR(255) NOT NULL, created_at TIMESTAMPDEFAULTCURRENT_TIMESTAMP, updated_at TIMESTAMPDEFAULTCURRENT_TIMESTAMPONUPDATECURRENT_TIMESTAMP, INDEX idx_username (username), INDEX idx_email (email) );
-- 创建文章表 CREATE TABLE posts ( id INT AUTO_INCREMENT PRIMARY KEY, user_id INTNOT NULL, title VARCHAR(200) NOT NULL, content TEXT, status ENUM('draft', 'published', 'archived') DEFAULT'draft', created_at TIMESTAMPDEFAULTCURRENT_TIMESTAMP, updated_at TIMESTAMPDEFAULTCURRENT_TIMESTAMPONUPDATECURRENT_TIMESTAMP, FOREIGN KEY (user_id) REFERENCES users(id) ONDELETE CASCADE, INDEX idx_user_id (user_id), INDEX idx_status (status), FULLTEXT idx_title_content (title, content) );
-- 连接查询 SELECT u.username, p.title, p.status, p.created_at FROM users u JOIN posts p ON u.id = p.user_id WHERE p.status ='published' ORDERBY p.created_at DESC LIMIT 10;
-- 子查询 SELECT username, email FROM users WHERE id IN (SELECTDISTINCT user_id FROM posts WHERE status ='published');
-- 分组统计 SELECT u.username, COUNT(p.id) as post_count FROM users u LEFTJOIN posts p ON u.id = p.user_id GROUPBY u.id, u.username ORDERBY post_count DESC;
-- 窗口函数(MySQL 8.0+) SELECT id, title, user_id, created_at, ROW_NUMBER() OVER (PARTITIONBY user_id ORDERBY created_at DESC) as user_post_rank FROM posts WHERE status ='published';
索引优化
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
-- 创建索引 CREATE INDEX idx_posts_created_at ON posts(created_at); CREATE INDEX idx_posts_user_status ON posts(user_id, status);
-- 复合索引 CREATE INDEX idx_posts_composite ON posts(user_id, status, created_at);
-- 唯一索引 CREATEUNIQUE INDEX idx_users_username ON users(username);
-- 查看索引使用情况 EXPLAIN SELECT*FROM posts WHERE user_id =1AND status ='published';
-- 分析索引统计信息 SHOW INDEX FROM posts;
事务处理
ACID特性
MySQL的InnoDB存储引擎支持ACID事务:
原子性(Atomicity):事务中的所有操作要么全部完成,要么全部不完成
一致性(Consistency):事务开始和完成时,数据都必须保持一致状态
隔离性(Isolation):并发事务之间相互隔离,互不干扰
持久性(Durability):事务完成后,对数据的修改是永久性的
事务操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
-- 开始事务 START TRANSACTION;
-- 执行操作 UPDATE accounts SET balance = balance -100WHERE id =1; UPDATE accounts SET balance = balance +100WHERE id =2;
-- 分区表(大表优化) CREATE TABLE logs ( id INT AUTO_INCREMENT, log_date DATE, message TEXT, PRIMARY KEY (id, log_date) ) PARTITIONBYRANGE (YEAR(log_date)) ( PARTITION p2023 VALUES LESS THAN (2024), PARTITION p2024 VALUES LESS THAN (2025), PARTITION pmax VALUES LESS THAN MAXVALUE );
配置优化
1 2 3 4 5 6 7 8 9
-- 查看当前配置 SHOW VARIABLES LIKE'innodb_buffer_pool_size'; SHOW VARIABLES LIKE'query_cache_size';