目录
什么是MySQL?有什么特点?
MySQL中有哪些常见的存储引擎?它们有什么区别?
什么是事务?MySQL如何支持事务?
什么是主键、外键、索引?
数据库三大范式是什么?
什么情况下会违反范式设计?为什么?
SQL语句有哪些类型?
JOIN有哪些类型?有什么区别?
什么是子查询?有哪些类型?
如何优化MySQL查询性能?
EXPLAIN命令有什么作用?
什么是索引?有哪些类型?
什么情况下索引会失效?
什么是MVCC?
MySQL 主从复制原理是什么?
什么是分库分表?有哪些策略?
如何设计一个高并发的点赞系统?
如何处理MySQL中的慢查询?
☺️MySQL备份策略有哪些?
什么是MySQL?有什么特点?
MySQL是一个开源的关系型数据库管理系统(RDBMS)
特点:开源、跨平台、支持多用户、多线程、支持多种存储引擎、性能高、可靠性好
InnoDB:支持事务、行级锁、外键,MySQL 5.5后的默认引擎
MyISAM:不支持事务和行级锁,但查询速度快
Memory:数据存储在内存中,速度快但重启后数据丢失
Archive:适合存储大量不常访问的归档数据
事务是一组原子性的SQL查询,要么全部执行成功,要么全部失败回滚
MySQL通过InnoDB引擎支持事务,具有ACID特性:
原子性(Atomicity)
一致性(Consistency)
隔离性(Isolation)
持久性(Durability)
主键:唯一标识表中每一行的列或列组合,不能为NULL
外键:一个表中的字段是另一个表的主键,用于建立表间关系
索引:提高查询速度的数据结构,类似书籍的目录
第一范式(1NF):每个字段都是不可分割的原子值
第二范式(2NF):在1NF基础上,非主键字段完全依赖于主键
第三范式(3NF):在2NF基础上,非主键字段不依赖于其他非主键字段
为了提高查询性能而故意冗余数据
需要频繁连接多个表的复杂查询
数据仓库或OLAP系统中常见的反范式设计
DDL(数据定义语言):CREATE、ALTER、DROP
DML(数据操作语言):INSERT、UPDATE、DELETE
DQL(数据查询语言):SELECT
DCL(数据控制语言):GRANT、REVOKE
TCL(事务控制语言):COMMIT、ROLLBACK
INNER JOIN:返回两表中匹配的行
LEFT JOIN:返回左表所有行,右表不匹配则为NULL
RIGHT JOIN:返回右表所有行,左表不匹配则为NULL
FULL JOIN:返回两表中所有行,不匹配则为NULL(MySQL不直接支持)
CROSS JOIN:返回两表的笛卡尔积
子查询是嵌套在另一个查询中的查询
类型:
标量子查询:返回单个值
列子查询:返回单列多行
行子查询:返回单行多列
表子查询:返回多行多列
合理设计索引
避免SELECT *,只查询需要的列
优化JOIN操作
使用EXPLAIN分析查询执行计划
避免在WHERE子句中对字段进行函数操作
合理使用分页查询
显示MySQL如何执行SQL语句
重要列:
type:连接类型(从好到差:system > const > eq_ref > ref > range > index > ALL)
key:实际使用的索引
rows:预估需要读取的行数
Extra:额外信息(如Using filesort, Using temporary等)
索引是帮助MySQL高效获取数据的数据结构
使用LIKE 前置模糊查询('%abc')
对索引列使用函数或表达式
数据类型隐式转换
使用OR条件且某些列没有索引
复合索引不满足最左前缀原则
MySQL有哪些锁机制?
按粒度分:
表级锁:开销小,加锁快,并发度低
行级锁:开销大,加锁慢,并发度高
按类型分:
共享锁(S锁):读锁,多个事务可同时持有
排他锁(X锁):写锁,只能由一个事务持有
MVCC(Multi-Version Concurrency Control,多版本并发控制)是一种用于 实现数据库并发事务访问时的非阻塞读 的机制,主要用于提升系统的并发性能和读取效率。
核心思想:
MVCC 通过为每一行记录维护多个版本,实现读写并发,读操作不阻塞写操作,写操作也不阻塞读操作。
每条记录会维护两个隐藏字段:
trx_id
:表示最近一次对该记录做修改的事务 ID。
roll_pointer
:指向回滚段(Undo Log)的指针,用于恢复旧版本数据。
MySQL 的主从复制是一种将主数据库的数据变更同步到一个或多个从数据库的机制。它主要用于读写分离、负载均衡以及数据备份等场景。
其核心原理可以分为三个阶段:
主库将变更记录写入二进制日志(binlog),这些日志记录了所有导致数据变更的 SQL 语句或行级操作;
从库通过 I/O 线程连接主库并拉取 binlog 内容,把它写入本地的中继日志(relay log);
从库的 SQL 线程再读取中继日志并执行日志中的 SQL,从而达到和主库一致的数据状态。
分库分表是指将原本存储在一个数据库或一个数据表中的数据,按一定规则拆分到多个数据库或表中,以缓解单库/单表带来的性能瓶颈。(但也带来分布式事务、跨库 JOIN、数据一致性等复杂问题)
分库是横向拆分数据库,例如按用户 ID 分到多个数据库实例上;
分表是将数据拆成多张表,比如按时间或 ID 拆成多张逻辑或物理表。常见的策略包括:
按范围分片(Range Sharding):如按时间、用户 ID 范围划分;
按哈希分片(Hash Sharding):对某个字段(如用户 ID)取模分片,分布更均匀;
按业务分片:不同业务放不同库,如订单、用户分库;
垂直拆分:将表按字段分类拆成多个表,减轻表宽压力;
混合策略:如先垂直再水平拆分。
使用缓存(Redis)进行点赞计数,减轻数据库压力
异步写入消息队列,后台批量更新数据库
使用 Redis 原子操作保证计数准确性
分布式锁或去重机制防止重复点赞
分库分表提高数据库扩展性
负载均衡分散访问压力
接口限流防止刷赞攻击
记录用户点赞状态保证点赞唯一性
处理 MySQL 慢查询,第一步是定位和分析。可以开启慢查询日志,找出执行时间长的 SQL。定位后,主要优化方向包括:
优化SQL语句
检查查询是否使用了合适的索引,避免全表扫描。调整 SQL 结构,比如避免 SELECT *,减少返回字段,拆分复杂查询。建立和优化索引
针对查询条件和排序字段建立合适的索引,避免冗余索引。合理设计表结构
避免过多的 JOIN 操作,合理拆分大表,减少数据冗余。查询缓存和缓存机制
利用应用层缓存(Redis、Memcached)缓存热点数据,减少数据库压力。分库分表和读写分离
将读写操作分离,读请求分散到从库,减轻主库压力。调整数据库配置
例如调整 InnoDB 缓冲池大小,优化连接数和并发参数。避免不必要的锁和事务
减少事务时间和锁范围,避免长时间锁表。
逻辑备份:mysqldump,跨平台,适合小型数据库
物理备份:数据文件复制,xtrabackup,速度快,适合大数据量
增量备份:基于binlog,只备份变化数据,节省空间
定时全备结合增量备份:常见且实用的备份方案
异地备份、多副本备份:防灾备份策略
自动化备份和监控:保障备份任务稳定执行