对于mysql层对sql层面的知识体系的理解和把握

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 而非 INTVARCHAR(20) 而非 VARCHAR(255))。
  • 命名规范
    • 表名、字段名使用小写字母、下划线分隔,见名知义。
    • 避免使用关键字和保留字。

2. 优化思路

  • 字段优化
    • 使用 NOT NULL 约束,简化查询条件。
    • 文本字段避免使用 TEXT/BLOB,若必须则拆分到扩展表。
  • 约束优化
    • 主键使用自增整数或业务无关的唯一值(如雪花ID)。
    • 外键约束在应用层或数据库层根据一致性要求选择是否使用。
  • 存储引擎选择
    • InnoDB 支持事务、行锁,适用于大多数场景。
    • MyISAM 适用于只读或读多写少的场景(注意锁机制和崩溃恢复)。

二、SQL查询基础与高级操作

1. 可用的SQL关键字

  • DQL(查询)SELECTFROMWHEREGROUP BYHAVINGORDER BYLIMITDISTINCTUNIONJOIN(INNER/LEFT/RIGHT)。
  • DML(操作)INSERTUPDATEDELETEREPLACE
  • DDL(定义)CREATEALTERDROPTRUNCATE
  • DCL(控制)GRANTREVOKE
  • 高级功能 :窗口函数(ROW_NUMBER()RANK())、CASE WHENWITH(CTE)、EXPLAIN

2. 如何衡量SQL好坏与调优

  • 衡量指标
    • 执行时间
    • 扫描行数(EXPLAIN 中的 rows
    • 是否使用索引(typerefrange 最佳,避免 ALL
    • 临时表与文件排序(Extra 中出现 Using temporaryUsing filesort 需警惕)
  • 调优步骤
    1. 使用 EXPLAIN 分析执行计划。
    2. 确保索引有效,避免全表扫描。
    3. 优化 WHERE 条件,避免在列上使用函数或运算。
    4. 减少 JOIN 的复杂度,必要时使用冗余字段。
    5. 分批处理大数据操作,避免锁表。

三、索引深度解析

1. 使用索引的场景

  • 频繁作为查询条件的字段(WHEREJOINORDER BYGROUP BY)。
  • 高区分度(基数高)的字段。
  • 查询返回数据量小的场景(覆盖索引)。

2. 如何使用索引

  • 创建单列索引、复合索引(注意最左前缀原则)。
  • 使用覆盖索引,避免回表。
  • 索引列尽量不为 NULL

3. 索引类型

  • 普通索引:加速查询。
  • 唯一索引:确保列值唯一。
  • 主键索引:唯一且非空。
  • 复合索引:多列组合索引。
  • 全文索引 :适用于文本搜索(MATCH AGAINST)。
  • 空间索引:地理数据。

4. 索引失效与排查

  • 失效场景
    • 对索引列使用函数、计算、类型转换。
    • LIKE% 开头。
    • 违反最左前缀原则。
    • 使用 OR 连接非索引列。
    • 数据分布不均,优化器选择全表扫描。
  • 排查方法
    • 使用 EXPLAIN 查看执行计划。
    • 使用 SHOW INDEX FROM table 查看索引状态。
    • 使用 OPTIMIZE TABLE 重建索引。

5. 比较两个索引的好坏

  • 使用 EXPLAIN 对比执行计划的 typerowsExtra
  • 使用 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 的一致性保证(确保日志写入顺序一致)。

相关推荐
2301_790300962 小时前
用Matplotlib绘制专业图表:从基础到高级
jvm·数据库·python
DFT计算杂谈2 小时前
VASP+PHONOPY+pypolymlpj计算不同温度下声子谱,附批处理脚本
java·前端·数据库·人工智能·python
数据知道2 小时前
PostgreSQL核心原理:为什么数据库偶尔会卡顿?
数据库·postgresql
Nandeska2 小时前
14、MySQL基于GTID的数据同步
数据库·mysql
Mr_Xuhhh2 小时前
MySQL表的内连接与外连接详解
java·前端·数据库
kyle-fang2 小时前
阿里云服务器部署MySQL
服务器·mysql·阿里云
l1t2 小时前
DeepSeek辅助总结postgresql wiki提供的数独求解器
数据库·sql·postgresql
appearappear2 小时前
大数据量处理
数据库
万行2 小时前
SQL进阶&索引篇
开发语言·数据库·人工智能·sql