大家好!
作为一名程序员,每天和各种各样的“数据库”打交道,已经成为我们的日常。当然,立志成为一名超级架构师的我,肯定要精通这项技能。咳咳!不过饭还是要一口一口吃的,“数据库”这个内容实在太大了,我们今天还是以关系型数据库的代表“MySQL说起,现如今,MySQL已经变得无处不在,从初创公司的小型项目到大型企业的核心系统,都在使用。
那么,作为开发者,如何系统地学习和掌握MySQL呢?
本文的核心目标有两个:
一是为你呈现一个结构化的MySQL知识框架;
二是,确保你不仅仅是“知其然”,还要“知其所以然”。
为了让这个知识框架更加直观,我画了一个思维导图,你可以看下:
如果你准备好深入MySQL的世界,那我们就开始吧 !
在学习的过程中,仅仅理解概念是不够的,我们还需要将其付诸实践,验证所学并巩固。这也是“通关要求”存在的原因。下面是每个章节的挑战任务,成功完成它们,就像过关斩将,证明你已经真正掌握了这部分内容。
utf8
和utf8mb4
这两个字符串编码的数据库有什么区别?utf8
的字符串编码会碰到什么问题?我在这里为大家举个例子,在思考和回答这个问题建议结合自身熟悉的业务场景来。好,我们开始吧!
👦 候选者: 面试官你好!我大部分是负责订单业务这块的,一帮我们这边在接到一个明确的需求,然后评审设计,如果碰到需要新增表的情况。我们会把完整的数模进行重新梳理关系。然后按照业务场景和需求进行抽象。具体思考过程如下:
1. 明确业务场景和需求
2. 确定主要实体和属性
3. 确定实体之间的关系:
4. 转化为表结构
CREATE TABLE `User` (
`userID` INT PRIMARY KEY AUTO\_INCREMENT,
`username` VARCHAR(255) NOT NULL,
`address` TEXT,
……
);
CREATE TABLE `Product` (
`productID` INT PRIMARY KEY AUTO\_INCREMENT,
`productName` VARCHAR(255) NOT NULL,
`price` DECIMAL(10, 2),
`stock` INT,
……
);
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`)
);
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`)
);
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进行设计。当然也会有我们程序员的参与。
👦 候选者: 这个过程大概就是这样。
如果可以,可以把自己的话录下来,然后复盘自己的对话。一般情况下表结构的设计会有多人参与,毕竟对数据库的频繁改动是很要命的!
Buffer Pool
是什么?它有什么作用?undo log
、redo log
、binlog
有什么用?记录锁+间隙锁
可以防止删除操作而导致的幻读吗?死锁
了,怎么办?死锁
的? 这本书我并不是特别推荐,不是书本身不好,而是好书太多了,毕竟第二版印刷时间也在10年前。我会把它当作工具书进行翻阅。比如我想要知道数据库性能影响点有哪些....
这本书有两个版本:掘金小册,出版书籍;如果你是刚入门的新手,那我推荐你看这本书,因为作者就是以一位新手的视角带你入门,非常友好。
极客时间的课程,如果你是新人可以有免费7天的体验卡。作者是前腾讯云数据库负责人,用大佬已经不足以形容他的厉害。极客时间的课程最厉害的地方在于它能带动你去思考,每节开头结尾都以问句形式让你进入状态。
贪多嚼不烂 !这三本已经可以满足入门进阶的标准了。如果你想更进一步并且集大成,你需要通过各种书籍,文章去自我印证。形成自己的思想并输出。
本篇已毕,受限于知识广度。我只按照本人的学习路径和理解来写这篇文章。如果各位有什么建议或者补充,欢迎评论区留言!我会持续更新完善这篇文章。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。