1.我们这个里说的对mysql的掌握,指的是在sql层的掌握
1.建表,设计表的思路是什么,优化的思路是什么
2.使用sql去查询数据,哪些关键字可以使用
3.如何优化sql查询
4.sql查询会遇到哪些问题,提供了哪些方案来解决
5.多条sql执行的时候,使用事务来处理,保证一次执行都执行,失败都失败,会遇到哪些问题,如何处理。
建立表的时候,我们要考虑的因素
1.考虑建立什么表,建立几张表
2.单表的字段,约束选择
1.对于第一条的解释,我们从几个维度来考虑
首先是否建立表,是根据业务那边,用户操作执行的流程到哪一步了,这个ui界面
可以设计几个表,存数据,这个产生的是否需要建立表
然后建立表的时候,注意规范
1.表的3范式,与反范式设计
2.数据库表的粒度,是要存什么样的一条数据
3.表的字段的长度,不要多于35个字段等
4.命名,设计规范
2.优化的思路:
考虑字段,约束的选用的优化
使用sql对数据处理
1.知道我们可以对数据去进行什么操作
2.对查询的时候可以有的特殊操作
3.如何衡量一个sql的好坏,如何调优
sql的索引相关知识
1.什么场景下,要使用索引
2.如何使用索引
3.有哪些索引的类型可以使用
4.索引什么情况下会失效、如何排查
5.如何比较两个索引的好坏
6.mysql的版本更迭对索引有什么影响
7.索引的底层实现原理是什么
事务相关
1.什么是事务
2.事务的底层实现机制是什么
3.mysql的事务隔离级别
4.事务什么时候会失效
5.什么是事务的2阶段提交
基于您提供的框架,我将补充您未完成的部分,并优化整体结构,使其更系统化、深入且易于理解。
一、建表与设计优化
1. 设计表的思路
- 业务与流程分析:根据用户操作流程和UI交互,确定数据产生的节点,判断是否需要建表及建几张表。
- 三范式与反范式 :
- 三范式:减少数据冗余,确保数据一致性(如用户信息单独成表,通过ID关联)。
- 反范式:适当冗余提升查询性能(如订单表直接存储用户名,避免连表查询)。
- 表的粒度:决定一条记录代表的业务含义(如订单表按订单粒度,而非按商品粒度)。
- 字段设计 :
- 字段数量建议不超过30个,过多可考虑垂直分表。
- 字段类型选择最精确的(如
TINYINT而非INT,VARCHAR(20)而非VARCHAR(255))。
- 命名规范 :
- 表名、字段名使用小写字母、下划线分隔,见名知义。
- 避免使用关键字和保留字。
2. 优化思路
- 字段优化 :
- 使用
NOT NULL约束,简化查询条件。 - 文本字段避免使用
TEXT/BLOB,若必须则拆分到扩展表。
- 使用
- 约束优化 :
- 主键使用自增整数或业务无关的唯一值(如雪花ID)。
- 外键约束在应用层或数据库层根据一致性要求选择是否使用。
- 存储引擎选择 :
- InnoDB 支持事务、行锁,适用于大多数场景。
- MyISAM 适用于只读或读多写少的场景(注意锁机制和崩溃恢复)。
二、SQL查询基础与高级操作
1. 可用的SQL关键字
- DQL(查询) :
SELECT、FROM、WHERE、GROUP BY、HAVING、ORDER BY、LIMIT、DISTINCT、UNION、JOIN(INNER/LEFT/RIGHT)。 - DML(操作) :
INSERT、UPDATE、DELETE、REPLACE。 - DDL(定义) :
CREATE、ALTER、DROP、TRUNCATE。 - DCL(控制) :
GRANT、REVOKE。 - 高级功能 :窗口函数(
ROW_NUMBER()、RANK())、CASE WHEN、WITH(CTE)、EXPLAIN。
2. 如何衡量SQL好坏与调优
- 衡量指标 :
- 执行时间
- 扫描行数(
EXPLAIN中的rows) - 是否使用索引(
type为ref、range最佳,避免ALL) - 临时表与文件排序(
Extra中出现Using temporary、Using filesort需警惕)
- 调优步骤 :
- 使用
EXPLAIN分析执行计划。 - 确保索引有效,避免全表扫描。
- 优化
WHERE条件,避免在列上使用函数或运算。 - 减少
JOIN的复杂度,必要时使用冗余字段。 - 分批处理大数据操作,避免锁表。
- 使用
三、索引深度解析
1. 使用索引的场景
- 频繁作为查询条件的字段(
WHERE、JOIN、ORDER BY、GROUP BY)。 - 高区分度(基数高)的字段。
- 查询返回数据量小的场景(覆盖索引)。
2. 如何使用索引
- 创建单列索引、复合索引(注意最左前缀原则)。
- 使用覆盖索引,避免回表。
- 索引列尽量不为
NULL。
3. 索引类型
- 普通索引:加速查询。
- 唯一索引:确保列值唯一。
- 主键索引:唯一且非空。
- 复合索引:多列组合索引。
- 全文索引 :适用于文本搜索(
MATCH AGAINST)。 - 空间索引:地理数据。
4. 索引失效与排查
- 失效场景 :
- 对索引列使用函数、计算、类型转换。
LIKE以%开头。- 违反最左前缀原则。
- 使用
OR连接非索引列。 - 数据分布不均,优化器选择全表扫描。
- 排查方法 :
- 使用
EXPLAIN查看执行计划。 - 使用
SHOW INDEX FROM table查看索引状态。 - 使用
OPTIMIZE TABLE重建索引。
- 使用
5. 比较两个索引的好坏
- 使用
EXPLAIN对比执行计划的type、rows、Extra。 - 使用
SHOW PROFILE或性能模式(Performance Schema)对比实际执行时间。 - 考虑索引大小与维护成本(写操作变慢)。
6. MySQL版本对索引的影响
- 5.6+:索引条件下推(ICP),减少回表。
- 5.7+:生成列索引,支持JSON索引。
- 8.0+:倒序索引、函数索引、隐藏索引(可测试删除索引影响)。
7. 索引底层实现原理
- InnoDB 索引结构 :B+树。
- 叶子节点存储数据(聚簇索引存储整行数据,二级索引存储主键值)。
- 非叶子节点存储索引键值和指针。
- 支持范围查询和排序优化。
四、事务深度解析
1. 什么是事务
- 事务是一组不可分割的SQL操作,满足ACID特性:
- 原子性:全部成功或全部失败。
- 一致性:数据从一个一致状态转换到另一个一致状态。
- 隔离性:事务之间互不干扰。
- 持久性:事务提交后数据永久保存。
2. 事务底层实现机制
- 原子性与持久性 :通过 redo log(重做日志)和 undo log(回滚日志)实现。
- redo log:保证事务持久性,支持崩溃恢复。
- undo log:保证事务原子性,用于回滚和MVCC。
- 隔离性:通过锁机制和多版本并发控制(MVCC)实现。
3. MySQL事务隔离级别
- 读未提交:可能脏读、不可重复读、幻读。
- 读已提交:避免脏读,可能不可重复读、幻读。
- 可重复读(MySQL默认):避免脏读、不可重复读,可能幻读(InnoDB通过MVCC部分解决)。
- 串行化:完全隔离,性能最低。
4. 事务失效场景
- 非InnoDB引擎(如MyISAM不支持事务)。
- 自动提交模式 (
autocommit=1,每条SQL独立事务)。 - 嵌套事务(MySQL不支持真正嵌套,使用保存点模拟)。
- 长事务:锁持有时间过长,影响并发。
5. 事务的两阶段提交(2PC)
- 目的:保证分布式事务的一致性(如跨数据库、跨服务)。
- 阶段一(准备阶段):协调者询问参与者是否可以提交,参与者执行事务但不提交,返回准备就绪状态。
- 阶段二(提交/回滚阶段):协调者根据所有参与者的反馈,发送提交或回滚指令。
- MySQL中的2PC:用于内部 redo log 和 binlog 的一致性保证(确保日志写入顺序一致)。