1. MySQL数据库基础操作全解析
作为一名长期与MySQL打交道的开发者,我深知数据库操作是后端开发的核心基本功。今天我将系统梳理MySQL的基础操作,从数据库创建到CRUD完整流程,结合多年实战经验,分享那些官方文档不会告诉你的避坑技巧。
1.1 数据库创建与字符集设置
创建数据库看似简单,但新手常在这里踩坑。最基本的创建语句是:
sql复制CREATE DATABASE db_name;
但实际生产环境中,我强烈建议使用以下完整写法:
sql复制CREATE DATABASE IF NOT EXISTS shop_db
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
这里有三个关键点需要注意:
IF NOT EXISTS避免重复创建报错,特别在自动化脚本中非常重要utf8mb4才是真正的UTF-8编码(MySQL的utf8其实是阉割版)- 指定COLLATE确保字符串比较的准确性
警告:MySQL 5.7及以下版本默认的latin1字符集会导致中文乱码,这是新手最常遇到的坑。务必在创建时就指定正确编码。
1.2 数据库查看与切换
查看所有数据库使用:
sql复制SHOW DATABASES;
切换数据库时,我习惯先确认当前所在库:
sql复制SELECT DATABASE(); -- 查看当前数据库
USE production_db; -- 切换数据库
1.3 数据库删除的防护措施
删除数据库是危险操作,建议先备份再执行:
sql复制-- 先备份
mysqldump -u root -p db_name > db_backup.sql
-- 再删除
DROP DATABASE IF EXISTS db_name;
生产环境中,我通常会设置数据库删除的权限控制,避免误操作。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 数据表操作实战指南
2.1 创建表的规范与技巧
创建表时,字段类型选择直接影响后续性能。这是我的常用字段类型选择方案:
sql复制CREATE TABLE `users` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`username` VARCHAR(50) NOT NULL COMMENT '用户名',
`balance` DECIMAL(10,2) DEFAULT 0.00 COMMENT '账户余额',
`created_at` DATETIME DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `idx_username` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
关键注意事项:
- 使用反引号包裹字段名避免关键字冲突
- 为字段添加COMMENT提高可读性
- 主键推荐使用自增INT而非UUID
- 时间字段设置默认值减少代码量
2.2 表结构查看与修改
查看表结构时,除了常规的DESC table_name,我更喜欢用:
sql复制SHOW CREATE TABLE users; -- 查看完整建表语句
修改表结构时,大表要特别小心:
sql复制-- 小表可以直接修改
ALTER TABLE users ADD COLUMN phone VARCHAR(20);
-- 大表修改建议使用pt-online-schema-change工具
-- 避免锁表导致服务不可用
2.3 表删除的安全方案
删除表前,我通常会:
- 确认是否有备份
- 检查是否有应用正在使用该表
- 使用事务确保操作原子性
sql复制BEGIN;
-- 先重命名表作为临时备份
RENAME TABLE important_data TO important_data_backup;
-- 确认应用正常运行后再删除
DROP TABLE IF EXISTS important_data_backup;
COMMIT;
3. CRUD操作深度解析
3.1 插入数据的性能优化
基础插入语法:
sql复制INSERT INTO users (username, balance) VALUES ('张三', 100.00);
实际项目中,我总结的优化技巧:
- 批量插入比单条插入效率高10倍以上
sql复制INSERT INTO users (username, balance) VALUES
('李四', 200.00),
('王五', 300.00),
('赵六', 400.00);
- 使用LOAD DATA INFILE导入大数据量
sql复制LOAD DATA INFILE '/path/to/users.csv'
INTO TABLE users
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n';
- 插入时忽略重复键错误
sql复制INSERT IGNORE INTO users (id, username) VALUES (1, 'admin');
3.2 查询操作的进阶技巧
3.2.1 基础查询优化
避免使用SELECT *,明确指定字段:
sql复制-- 不好的写法
SELECT * FROM users;
-- 推荐的写法
SELECT id, username, created_at FROM users;
3.2.2 条件查询与索引
WHERE条件要注意索引使用:
sql复制-- 有索引的字段在前
SELECT * FROM users
WHERE username = 'admin' AND status = 1;
-- 避免在索引字段上使用函数
SELECT * FROM users
WHERE DATE(created_at) = '2023-01-01'; -- 糟糕的写法
3.2.3 分页查询优化
大表分页不要使用OFFSET:
sql复制-- 低效写法(数据量大时慢)
SELECT * FROM users LIMIT 10000, 20;
-- 高效写法(使用索引覆盖)
SELECT * FROM users WHERE id > 10000 LIMIT 20;
3.3 更新操作的事务控制
更新数据必须使用事务:
sql复制START TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE user_id = 1;
UPDATE accounts SET balance = balance + 100 WHERE user_id = 2;
COMMIT;
注意检查受影响行数:
sql复制UPDATE users SET status = 1 WHERE id = 10;
SELECT ROW_COUNT(); -- 检查实际更新行数
3.4 删除操作的软删除方案
实际项目中,我推荐使用软删除而非物理删除:
sql复制-- 添加is_deleted字段
ALTER TABLE users ADD COLUMN is_deleted TINYINT DEFAULT 0;
-- 软删除
UPDATE users SET is_deleted = 1 WHERE id = 10;
-- 查询时排除已删除数据
SELECT * FROM users WHERE is_deleted = 0;
4. MySQL操作常见问题与解决方案
4.1 字符集问题排查
遇到乱码时检查三个层面:
- 数据库字符集
sql复制SHOW VARIABLES LIKE 'character_set_database';
- 表字符集
sql复制SHOW CREATE TABLE users;
- 连接字符集
sql复制SHOW VARIABLES LIKE 'character_set%';
4.2 性能问题诊断
使用EXPLAIN分析查询:
sql复制EXPLAIN SELECT * FROM users WHERE username = 'admin';
关键指标:
- type列:最好达到ref或range级别
- rows列:扫描行数越少越好
- Extra列:避免出现Using filesort
4.3 事务隔离问题
常见的并发问题解决方案:
- 丢失更新:使用SELECT FOR UPDATE
sql复制START TRANSACTION;
SELECT * FROM accounts WHERE user_id = 1 FOR UPDATE;
-- 执行更新操作
COMMIT;
- 幻读问题:使用间隙锁或升级隔离级别
sql复制SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
5. 生产环境最佳实践
经过多年实战,我总结出以下MySQL操作黄金法则:
- 所有DDL操作必须在低峰期执行,并使用工具监控锁等待
- 批量操作数据量控制在1000条/次以内
- 重要操作前必须备份(mysqldump或xtrabackup)
- 为所有表添加created_at和updated_at字段
- 禁止在前端拼接SQL,必须使用参数化查询
最后分享一个监控长事务的技巧:
sql复制SELECT * FROM information_schema.INNODB_TRX
WHERE TIME_TO_SEC(TIMEDIFF(NOW(), trx_started)) > 60;
掌握这些MySQL基础操作和实战技巧,能让你在开发中少走很多弯路。记住,数据库操作无小事,每个命令都可能影响线上服务,务必谨慎对待。
