数据库 | 看这一篇就够了!最全MySQL数据库知识框架!

news2024/10/7 16:27:54

大家好!
作为一名程序员,每天和各种各样的“数据库”打交道,已经成为我们的日常。当然,立志成为一名超级架构师的我,肯定要精通这项技能。咳咳!不过饭还是要一口一口吃的,“数据库”这个内容实在太大了,我们今天还是以关系型数据库的代表“MySQL说起,现如今,MySQL已经变得无处不在,从初创公司的小型项目到大型企业的核心系统,都在使用。
那么,作为开发者,如何系统地学习和掌握MySQL呢?

本文的核心目标有两个:
一是为你呈现一个结构化的MySQL知识框架;
二是,确保你不仅仅是“知其然”,还要“知其所以然”。
为了让这个知识框架更加直观,我画了一个思维导图,你可以看下:
在这里插入图片描述
如果你准备好深入MySQL的世界,那我们就开始吧 !


通关要求

在学习的过程中,仅仅理解概念是不够的,我们还需要将其付诸实践,验证所学并巩固。这也是“通关要求”存在的原因。下面是每个章节的挑战任务,成功完成它们,就像过关斩将,证明你已经真正掌握了这部分内容。

入门MySQL

实操验证标准
  1. 会安装配置MYSQL
  2. 创建一个MySQL实例。
  3. 完成基础的CRUD操作和一些常用的指令。
面试通关验证标准:
  1. 创建utf8 utf8mb4 这两个字符串编码的数据库有什么区别?utf8 的字符串编码会碰到什么问题?

数据库设计

实操验证标准
  1. 设计一个简单的电商数据库模型,包含商品、用户和订单三个表。
  2. 数据模型满足范式。
面试通关验证标准:
  1. 你在项目中有自己设计表结构吗?一般会怎么去设计一张表的?

我在这里为大家举个例子,在思考和回答这个问题建议结合自身熟悉的业务场景来。好,我们开始吧!

👦 候选者: 面试官你好!我大部分是负责订单业务这块的,一帮我们这边在接到一个明确的需求,然后评审设计,如果碰到需要新增表的情况。我们会把完整的数模进行重新梳理关系。然后按照业务场景和需求进行抽象。具体思考过程如下:

1. 明确业务场景和需求

  • 用户下单
  • 订单支付
  • 发货管理
  • 订单状态变更(如:待支付、已支付、已发货、已完成、已取消等)
  • 退货申请与处理

2. 确定主要实体和属性

  • 用户(User):用户ID、用户名、地址等。
  • 商品(Product):商品ID、商品名称、商品价格、商品库存等。
  • 订单(Order):订单ID、下单用户、总金额、订单状态、下单时间、支付时间、发货时间、完成时间等。
  • 订单详情(OrderDetail):关联商品、购买数量、商品当前价格等。
  • 退货申请(ReturnApplication):申请原因、申请时间、处理状态、处理结果等。

3. 确定实体之间的关系

  • 用户与订单:一对多。
  • 商品与订单详情:一对多。
  • 订单与订单详情:一对多。
  • 订单与退货申请:一对多。

4. 转化为表结构

  1. User 表:
CREATE TABLE `User` (
    `userID` INT PRIMARY KEY AUTO_INCREMENT,
    `username` VARCHAR(255) NOT NULL,
    `address` TEXT,
    ……
);
  1. Product 表:
CREATE TABLE `Product` (
    `productID` INT PRIMARY KEY AUTO_INCREMENT,
    `productName` VARCHAR(255) NOT NULL,
    `price` DECIMAL(10, 2),
    `stock` INT,
    ……
);
  1. Order 表:
CREATE TABLE `Order` (
    `orderID` INT PRIMARY KEY AUTO_INCREMENT,
    `userID` INT,
    `totalAmount` DECIMAL(10, 2),
    `status` ENUM('pending', 'paid', 'shipped', 'completed', 'canceled'),
    `orderTime` DATETIME,
    `paymentTime` DATETIME,
    `shippingTime` DATETIME,
    `completionTime` DATETIME,
    ……
    FOREIGN KEY (`userID`) REFERENCES `User`(`userID`)
);
  1. OrderDetail 表:
CREATE TABLE `OrderDetail` (
    `orderDetailID` INT PRIMARY KEY AUTO_INCREMENT,
    `orderID` INT,
    `productID` INT,
    `quantity` INT,
    `currentPrice` DECIMAL(10, 2),
    ……
    FOREIGN KEY (`orderID`) REFERENCES `Order`(`orderID`),
    FOREIGN KEY (`productID`) REFERENCES `Product`(`productID`)
);
  1. ReturnApplication 表:
CREATE TABLE `ReturnApplication` (
    `applicationID` INT PRIMARY KEY AUTO_INCREMENT,
    `orderID` INT,
    `reason` TEXT,
    `applicationTime` DATETIME,
    `status` ENUM('pending', 'approved', 'rejected'),
    ……
    FOREIGN KEY (`orderID`) REFERENCES `Order`(`orderID`)
);

5. 优化设计
第一轮我们会把这些属性头脑风暴然后一一都列出来。判断它们是否符合范式。若一张表字段过多就要拆表了。表设计是个很复杂的活计,一般都是专门的DBA进行设计。当然也会有我们程序员的参与。

👦 候选者: 这个过程大概就是这样。

总结

如果可以,可以把自己的话录下来,然后复盘自己的对话。一般情况下表结构的设计会有多人参与,毕竟对数据库的频繁改动是很要命的


SQL操作

实操验证标准
  1. 编写一个涉及子查询和JOIN操作的复杂查询语句,同时使用Explain对其进行分析。

InnoDB存储引擎

实操验证标准
  1. 画出B+树的基础结构,并对比其与普通二叉搜索树的优势。
面试通关验证标准:
  1. 你能讲讲执行一条 select 语句,期间发生了什么?
  2. MySQL 一行记录是怎么存储的?
  3. 为什么 MySQL 采用 B+ 树作为索引?
  4. 索引失效有哪些?

性能与优化【重点突击】

实操验证标准
  1. 创建一个并发场景(比如通过脚本模拟),观察并描述数据库的锁机制如何工作。演示如何利用日志进行数据恢复。
面试通关验证标准:
  1. Buffer Pool 是什么?它有什么作用?
  2. 事务隔离级别是怎么实现的?
  3. MySQL 可重复读隔离级别,完全解决幻读了吗?
  4. MySQL 日志:undo logredo logbinlog 有什么用?
  5. MySQL 有哪些锁?
  6. MySQL 是怎么加锁的?
  7. update 没加索引会锁全表?
  8. MySQL 记录锁+间隙锁可以防止删除操作而导致的幻读吗?
  9. MySQL 死锁了,怎么办?
  10. 字节面试:加了什么锁,导致死锁的?

与Java的合作

实操验证标准
  1. 使用Java配合Mybatis框架,对你之前设计的电商数据库模型进行基本的CRUD操作。

备份与高可用

实操验证标准
  1. 为你的电商数据库建立一个备份策略。
  2. 当数据过大,设计一个简单的数据分片方案并实操。

学习资料推荐

  1. MySQL技术内幕
    在这里插入图片描述
    这本书我并不是特别推荐,不是书本身不好,而是好书太多了,毕竟第二版印刷时间也在10年前。我会把它当作工具书进行翻阅。比如我想要知道数据库性能影响点有哪些…

  2. MySQL是怎样运行的

这本书有两个版本:掘金小册出版书籍;如果你是刚入门的新手,那我推荐你看这本书,因为作者就是以一位新手的视角带你入门,非常友好。

  1. MYSQL实战45讲

在这里插入图片描述
极客时间的课程,如果你是新人可以有免费7天的体验卡。作者是前腾讯云数据库负责人,用大佬已经不足以形容他的厉害。极客时间的课程最厉害的地方在于它能带动你去思考,每节开头结尾都以问句形式让你进入状态。

贪多嚼不烂 !这三本已经可以满足入门进阶的标准了。如果你想更进一步并且集大成,你需要通过各种书籍,文章去自我印证。形成自己的思想并输出。


面试题资料推荐

  1. 如何保障MySQL和Redis的数据一致性?
    在这里插入图片描述

  2. 面试逆渣
    在这里插入图片描述

  3. Java Guide面试题汇总
    在这里插入图片描述


总结

本篇已毕,受限于知识广度。我只按照本人的学习路径和理解来写这篇文章。如果各位有什么建议或者补充,欢迎评论区留言!我会持续更新完善这篇文章。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1164240.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

黄执中老师人际说服课思考总结(个人笔记整理 ①)

问题描述和解决方法: 😤职场中明明是ta应该做的事,ta为何还生气呢?; 😠不知道怎么和家人孩子沟通?自己明明是对的,可别人就是不听 😡不知道怎么安慰朋友?&…

Python time strptime()和strftime()

1 strptime()方法 根据指定的格式把一个时间字符串解析为时间元组 重要的时间日期格式化符号 %y 两位数的年份表示(00-99) %Y 四位数的年份表示(000-9999) %m 月份(01-12) %d 月内中的一天(0-…

主机ping、ssh连接不通本地虚拟机

一、问题描述 在使用vscode remote ssh时,连接timeout,而且主机无论如何也ping不通虚拟机,但是虚拟机可以ping通主机。通过vagrant也可以连接虚拟机。 二、解决方案 试了网上包括设置remote ssh在内的许多方法都不行。重新查看主机和虚拟机…

C++类和对象-->默认成员函数

文章目录 类的6个默认成员函数初始化和清理构造函数构造函数概念构造函数特征 析构函数析构函数概念析构函数特征 拷贝赋值拷贝构造函数拷贝构造函数概念拷贝构造函数特征 赋值运算重载运算符重载运算符重载特征 赋值运算符重载赋值运算符特征 取地址重载取地址操作符重载const…

C#中使用LINQtoSQL管理SQL数据库之添加、修改和删除

目录 一、添加数据 二、修改数据 三、删除数据 四、添加、修改和删除的源码 五、生成效果 1.VS和SSMS原始记录 2.删除ID2和5的记录 3.添加记录ID2、5和8 4.修改ID3和ID4的记录 用LINQtoSQL管理SQL Server数据库时,主要有添加、修改和删除3种操作。 项目中创…

Unity AssetBundle批量打包、加载(场景、Prefab)完整流程

目录 1、文章介绍 2、具体思路和写法 (1)AB包的打包 (2)AB包的加载 (3)AB包卸载 3、结语 1、文章介绍 本篇博客主要起记录和学习作用,简单的介绍一下AB包批量的打包和加载AB包的方式&…

项目实战:编辑页面加载库存信息

1、前端编辑页面加载水果库存信息逻辑edit.js let queryString window.location.search.substring(1) if(queryString){var fid queryString.split("")[1]window.onloadfunction(){loadFruit(fid)}loadFruit function(fid){axios({method:get,url:edit,params:{fi…

【IIS搭建网站】在本地电脑上搭建web服务器并实现外网访问

文章目录 1.前言2.Windows网页设置2.1 Windows IIS功能设置2.2 IIS网页访问测试 3. Cpolar内网穿透3.1 下载安装Cpolar内网穿透3.2 Cpolar云端设置3.3 Cpolar本地设置 4.公网访问测试5.结语 1.前言 在网上各种教程和介绍中,搭建网页都会借助各种软件的帮助&#xf…

【APP】go-musicfox - 一款网易云音乐命令行客户端, 文件很小Mac版本只有16.5M

go-musicfox 是用 Go 写的又一款网易云音乐命令行客户端,支持各种音质级别、UnblockNeteaseMusic、Last.fm、MPRIS 和 macOS 交互响应(睡眠暂停、蓝牙耳机连接断开响应和菜单栏控制等)等功能特性。 预览 启动 启动界面 主界面 主界面 通…

【docker】安装 showdoc

1. 下载镜像 2.新建存放showdoc数据的目录 3.启动showdoc容器 4.打开网页 1. 下载镜像 # 原版官方镜像安装命令(中国大陆用户不建议直接使用原版镜像,可以用后面的加速镜像) docker pull star7th/showdoc # 中国大陆镜像安装命令(安装后记得执行docke…

数组反转(LeetCode)

凑数 ... 描述 : 给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。 如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。 假设环境不允许存储 64 位整数(有符号或无符号)。 题目…

Dubbo中的负载均衡算法之一致性哈希算法

Dubbo中的负载均衡算法之一致性哈希算法 哈希算法 假设这样一个场景,我们申请一台服务器来缓存100万的数据,这个时候是单机环境,所有的请求都命中到这台服务器。后来业务量上涨,我们的数据也从100万上升到了300万,原…

VS使用小技巧——如何让别人看不到你写的代码,却能够运行你的代码

VS使用小技巧 前言方法使用静态库的示例如何创建静态库如何导入静态库Xcode里导入静态库VS2022导入静态库 前言 在实际生活中,作为程序员偶尔会因为资金不够用了选择去兼职写代码,当我们写完一个代码,将他发给某个公司的时候,我们…

C++——定义一个 Box(盒子)类,在该类定义中包括数据成员和成员函数

完整代码: /*定义一个 Box(盒子)类,在该类定义中包括数据成员和成员函数。 数据成员:length (长)、width(宽)和 height(高); 成员函数:构造函数 …

阿里云双十一大促:云服务器1年99元,新老同享,续费同价!

2023年双十一购物狂欢节来临,阿里云推出了金秋云创季活动,活动力度很大,不再是老用户与狗不得入内,2核2G3M云服务器1年99元,新老同享,续费同价! 活动地址:传送门>>> 活动详…

【C++】C++11【下】lambda表达式|thread线程库

目录 1、lambda表达式 1.1 lambda表达式的引入 1.2 lambda表达式的语法 1.3 lambda表达式的原理 2、线程库 2.1thread类的介绍 2.2 线程函数参数 2.3 原子性操作库(atomic) 2.4 使用场景 应用场景1: 应用场景2: 应用场景3: 应用场景4&#xf…

SAFe大规模敏捷框架

Leangoo领歌是一款永久免费的专业的敏捷开发管理工具,提供端到端敏捷研发管理解决方案,涵盖敏捷需求管理、任务协同、进展跟踪、统计度量等。 
 Leangoo领歌上手快、实施成本低,可帮助企业快速落地敏捷,提质增效、缩短周期、加速…

与AI对话的艺术:如何优化Prompt以获得更好的响应反馈

前言 在当今数字化时代,人工智能系统已经成为我们生活的一部分。我们可以在智能助手、聊天机器人、搜索引擎等各种场合与AI进行对话。然而,要获得有益的回应,我们需要学会与AI进行有效的沟通,这就涉及到如何编写好的Prompt。 与…

【Linux学习笔记】进程概念(下)

进程地址空间1. 虚拟地址2. 什么是进程地址空间3. 进程地址空间的映射。4. 地址空间存在的意义5. 写时拷贝 进程地址空间 1. 虚拟地址 来看这样一段代码。 #include <stdio.h> #include <unistd.h>int global_value 100;int main() {pid_t id fork();if(id &l…

3206. 拼图

给出一个 nm 的方格图&#xff0c;现在要用如下 L 型的积木拼到这个图中&#xff0c;使得方格图正好被拼满&#xff0c;请问总共有多少种拼法。 其中&#xff0c;方格图的每一个方格正好能放积木中的一块。 积木可以任意旋转。 输入格式 输入的第一行包含两个整数 n,m&#xff…