基础核心概念
MySQL 是什么?
MySQL 是一款开源的关系型数据库(RDBMS),基于 SQL 语言。它主打轻量、高性能、高可用和易部署,是互联网行业的首选,电商、金融、社交等 90% 以上的业务都在用。
它的核心特点包括:
- 关系型特性:支持 ACID 事务、外键、约束及多表关联查询。
- 高性能:底层优化优秀,单表千万级数据查询依然高效。
- 多存储引擎:支持插件式引擎,最常用的是
InnoDB(默认)和MyISAM。 - 高可用:支持主从复制、读写分离和集群部署,避免单点故障。
- 跨平台:适配 Linux/Windows/Mac 等主流服务器系统。
InnoDB 与 MyISAM 的区别
MySQL 5.5 及以后版本默认存储引擎是 InnoDB。它是事务安全型引擎,而 MyISAM 更偏向性能型,目前已被官方逐步淘汰。面试中常问两者区别,核心在于事务支持和锁机制的不同。
char 与 varchar 的区别
二者都是字符串类型,但存储方式和长度固定性不同。
- char(n):定长字符串。无论存入多少字符,都会占用
n个字符的空间,不足补空格。适合短字符串或长度固定的场景,如手机号、身份证号、状态码。 - varchar(n):变长字符串。实际占用空间 = 真实字符长度 + 1/2 个字节(存储长度)。不会补空格,适合长度不固定的长字符串,如用户名、商品标题。
面试坑点:varchar(5) 和 varchar(200) 存储 "abc" 有区别吗?
标准答案是:存储上无区别,性能上几乎无区别。MySQL 只会校验是否超过最大长度,不会因为定义的长度大而浪费空间或变慢。但建议按需定义,避免字段溢出或索引失效。
datetime 与 timestamp 的区别
- datetime:占 8 字节,范围
1000-01-01 ~ 9999-12-31,不支持时区转换。存入什么时间就显示什么时间。 - timestamp:占 4 字节,范围
1970-01-01 ~ 2038-01-19,支持时区转换(存 UTC,查时转回)。
推荐优先使用 datetime,避免 2038 年溢出问题;若有跨国跨时区需求,再考虑 timestamp。
索引类型详解
- 主键索引(Primary Key):一张表只能有一个,非空且唯一。InnoDB 中主键是聚簇索引,数据按主键排序存储,查询效率最高。建议用自增整型。
- 唯一索引(Unique Key):可以有多个,字段唯一但可为空(最多一个 null)。用于保证手机号、邮箱的唯一性。
- 普通索引(Index):可以有多个,字段值可重复、可空。单纯提升查询速度。
- 外键索引(Foreign Key):建立表间关联,保证参照完整性。生产环境慎用,会降低增删改效率,一般由业务层维护。
索引的作用与原理
索引是 MySQL 的一种特殊数据结构(B+ 树),相当于表的目录。它能提升查询速度、加速排序分组、保证数据唯一性。
提速本质:无索引是全表扫描(O(n)),有索引通过 B+ 树二分查找(O(logn))。但索引不是越多越好,会增加维护成本、占用磁盘空间,甚至导致优化器选择错误。
最左匹配原则
这是联合索引的核心规则。创建 (a,b,c) 的联合索引时,MySQL 优先匹配最左侧字段,依次向右匹配,跳过字段会导致索引失效。


