很多刚入行的小伙伴一看到 MySQL 就头大,什么 B + 树、MVCC、事务隔离级别,一大堆名词越看越懵。
其实小白学 MySQL,不用一上来啃底层源码。先把常用语法、踩坑点、简单优化学会,足够应付日常开发和面试基础题。
这篇就是专为小白准备的秘籍,不讲复杂原理,只讲实操、口诀、避坑要点。
一、建表必守的 5 条简单规矩
写 SQL 第一步就是建表,表设计不好,后面全是坑。
✅ 1. 每张表都要有主键 id 推荐用id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,自增主键,简单稳定。不要用手机号、身份证做主键。
✅ 2. 字段尽量选合适小类型 能用 int 就不用 bigint;非负数加 UNSIGNED;字符串长度够用就行,不要全部 varchar (255)。
✅ 3. 时间字段不要用 varchar 存 创建时间create_time datetime,更新时间update_time datetime。 不要写成字符串存时间,无法排序、不能比较,还走不了索引。
✅ 4. 字段尽量不允许 NULL 能设置NOT NULL就不要 NULL。NULL 会影响索引,查询容易出意料之外的结果。默认值按需设置。
✅ 5. 统一字符集 utf8mb4 支持 emoji 表情,不要用老的 utf8。
CREATE TABLE `user` ( `id` int unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', `name` varchar(50) NOT NULL COMMENT '用户名', `phone` varchar(11) NOT NULL COMMENT '手机号', `create_time` datetime NOT NULL COMMENT '创建时间', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;💡小白口诀:有主键,类型小,时间不用字符串,字段尽量不为空
二、索引怎么建?小白极简版
很多新手两个极端:要么完全不建索引,要么每个字段都建索引。
✅什么时候建索引
经常放在 WHERE、JOIN、ORDER BY、GROUP BY 里的字段,才建索引。 例:经常按手机号查询用户 → phone 建索引。
❌不要建索引
- 更新非常频繁的字段(索引维护消耗性能)
- 区分度很低字段(比如性别,只有 0/1,建索引没用)
- 短、小表(几百行数据,全表扫描比索引更快)
联合索引记住一句话:最左优先
建立索引idx_name_phone(name,phone)查询条件从左往右连续匹配才能命中索引。
可以命中:
- where name=' 张三'
- where name=' 张三 ' and phone='13800138000'
无法命中:
- where phone='13800138000'
💡小白口诀:联合索引,从左开始,遇到范围后面失效
索引失效最常见 3 个坑(小白高频踩)
- like
%关键词,前面带 % 不走索引;关键词%可以 - where 条件里,字段套函数、运算,索引失效
-- 失效 WHERE DATE(create_time)='2026-09-11'- 隐式类型转换:varchar 字符串字段,拿数字去匹配,索引失效
三、CRUD 基础,小白容易写错的地方
查询 SELECT
❌禁止SELECT *只查需要的字段,减少传输,有机会触发覆盖索引。 ✅推荐select id,name,phone from user
删除 DELETE
小白最大坑:忘记 where,直接清空整张表!
-- 危险!不写where,删除全表 DELETE FROM user;⚠️生产执行 DELETE,先执行 SELECT 核对数据,再删
更新 UPDATE
同样!不加 WHERE 会更新全表
-- 危险!所有行name都被修改 UPDATE user set name='test';INSERT
批量插入优先一条 sql 插入多行,减少数据库连接开销
INSERT INTO user(name,phone) VALUES ('a','13800000000'), ('b','13900000000');💡小白口诀:删改必带 where,上线前先用 select 校验
四、事务什么时候用?小白简单理解
事务:一组 SQL,要么全部成功,要么全部回滚。 关键词:BEGIN; COMMIT; ROLLBACK;
适合场景:转账、订单扣库存,多步操作必须同时成功。
BEGIN; UPDATE account SET money = money -100 WHERE id=1; UPDATE account SET money = money +100 WHERE id=2; COMMIT;中间出错,执行 ROLLBACK 撤销。
⚠️小白注意:
- 不要写超大事务,事务越大锁时间越长,容易卡顿
- 查询语句不需要包事务,没必要
💡小白口诀:多操作要捆绑,才开事务;查询不用事务。
五、Explain 看懂慢查询(小白不用懂全部)
想看 SQL 有没有走索引,前面加 EXPLAIN
EXPLAIN SELECT name FROM user WHERE phone='13800138000';小白只看两个字段:
type:看到 ALL,代表全表扫描,需要优化Extra:看到 Using filesort / Using temporary,代表性能差
只要看到 ALL,就思考:是不是没建索引?索引失效了?
六、分页查询坑:limit 大偏移量
❌不好写法
select * from user limit 100000,10;数据库会扫描前面 10 万行,丢弃后返回 10 条,越往后越慢。
✅优化写法(主键分页)
select * from user where id>100000 limit 10;七、count 统计,小白别乱用
- count (*):统计行数,推荐
- count (字段):统计该字段不为 NULL 的数据,会过滤空值
不要盲目用 count (*) 做超大表实时统计,大数据量表可以用缓存保存总数。
八、日常开发 10 条保命守则
- 线上执行 SQL 前,先在测试库跑一遍
- 执行 UPDATE/DELETE 前,先用 SELECT 确认影响行数
- 不使用 SELECT *
- 尽量避免 like '% xxx'
- 字段尽量 NOT NULL,时间不用字符串存储
- 索引不是越多越好,只给查询频繁字段建索引
- 大表不要随便 ALTER,容易锁表
- 尽量少用子查询,能用 JOIN 简单写
- 避免一次性查询几十万条,分批分页读取
- 生产禁止 MyISAM,全部用 InnoDB
九、快速排查问题思路(小白应急)
线上 SQL 慢怎么办?
- 加上 EXPLAIN 看执行计划
- type 是不是 ALL 全表扫描?
- 是否缺少索引 / 索引失效?
- 是否 limit 大偏移量、join 多表?