
数据库专题开篇零基础迈入 MySQL 的第一步如果说高效的并发程序是快速流动、充满活力的“河流”那么数据库就是承载这些河流的“水库”。在云原生与微服务时代不管你的业务逻辑写得多漂亮如果不会高效、安全地存储和读取数据一切都是空谈。今天我们就从零开始为你铺平一条从“小白”到“掌控数据”的通畅之路。一、 看清世界什么是数据库用 Excel 降维理解初学者听到“关系型数据库”、“结构化查询语言”这些词往往会觉得头大。其实你完全可以把以 MySQL 为代表的数据库想象成一个超级进化版、运行在远程服务器上的 Excel 软件。我们可以做个非常直观的对齐类比Excel 的概念MySQL 数据库的概念核心本质一个.xlsx文件/项目数据库 (Database)存放一整个项目所有数据的容器。工作表 (Sheet如用户表)数据表 (Table)规定了结构和行列的二维矩阵。表头列名 (如 姓名、年龄)字段/列 (Column / Field)定义每一列数据叫什么、是什么数据类型。单行数据 (如 张三, 18岁)记录/行 (Row / Record)真正写入的每一条具体业务数据。1. 广阔的生态关系型 vs 非关系型在市面上你会听到各种各样的数据库名词它们主要分为两大阵营关系型数据库SQL如 MySQL、PostgreSQL、Oracle特点就像 Excel数据必须一行一列、规规矩矩地存放在“二维表”里。表与表之间可以通过某个字段如用户ID建立“关联关系”。场景大总管。适合存放结构严谨、错一点都不行的核心资产比如账号、订单、银行余额。非关系型数据库NoSQL如 Redis、MongoDB特点放飞自我。不搞表格那一套有的像 Go 语言里的 Map键值对有的像大文本JSON。场景特种兵。适合追求极致速度如 Redis 纯内存操作缓存或存放极其杂乱的数据。而 MySQL正是目前全球互联网占有率最高、最经典的关系型数据库王者。2. 为什么不用 Excel 存网站数据非要用 MySQL高并发支持Excel 同一时间只能一个人编辑后面的人开就会提示“只读”而 MySQL 支持成千上万个用户同时读写。海量吞吐Excel 超过几十万行就会卡死崩掉而 MySQL 能够轻松应对千万级、亿级的数据存储。数据安全MySQL 拥有严格的事务机制能保证哪怕服务器突然断电银行转账数据也绝对不会出错。二、 搬回工具MySQL 的安装、启动与连接要想让 MySQL 为你干活首先得在电脑服务器上把它跑起来。1. 安装与服务启动安装在 Windows 上初学者建议直接下载官方的MySQL Installer一路 Next 傻瓜式安装期间它会让你设置一个root 用户即超级管理员的密码请务必死死记住这个密码。服务的本质MySQL 安装好后在系统中是以一个“后台服务/守护进程”Windows 下叫MySQL服务Linux 下叫mysqld的形式默默运行的。如何启动Windows打开任务管理器→ \rightarrow→服务→ \rightarrow→找到MySQL→ \rightarrow→右键启动。命令行管理员权限net start mysql。1. 核心MySQL 数据库服务端下载最常用进入后可以根据你的系统Windows / macOS / Linux选择对应的安装包。最新 GA / LTS 版本直达[可疑链接已删除]经典 8.0 稳定版直达目前国内企业生产环境占有率极高MySQL Community Server 8.0 下载页2. ️ 辅助周边生态官方下载按需选择如果你需要官方自带的图形化工具或打包安装器可以走以下通道Windows 一键打包安装器MySQL Installer for Windows注官方提供的这个 Installer 适合懒人一键安装服务端 图形化界面。官方自带的图形化管理软件MySQL Workbench 下载页虽然它是官方的但正如我们博客中所说日常开发中更推荐你使用Navicat或免费开源的DBeaver界面和操作会更加人性化。全套社区版组件总览MySQL Community Downloads 总目录 初学者下载小贴士Windows 用户在下载页面选择系统为Microsoft Windows后建议优先下载带有.msi后缀的安装包这是安装向导版类似软件安装下一步下一步即可不建议直接下.zip压缩包那个需要自己手动配环境变量和写初始化配置文件容易把新手劝退。下载速度慢的平替方案如果官方网站下载速度极慢可以直接去国内各大高校的镜像站如清华大学开源软件镜像站、华为开源镜像站搜mysql直接拉取安装包速度会起飞。2. 客户端连接谁来发号施令MySQL 服务在后台跑起来后它只是个默默等待连接的“木疙瘩”Server 端。我们需要一个“客户端Client”去连接它、向它发送指令。方式 A自带的黑窗口命令行最硬核打开终端输入连接命令输入你安装时设定的密码mysql-uroot-p当看到终端变成mysql开头时说明你已经成功潜入数据库内部方式 B图形化客户端初学者强烈推荐日常开发中我们一般不看黑窗口而是使用Navicat、DataGrip或免费开源的DBeaver等图形化软件。你只需要在软件里输入 IP本地填127.0.0.1或localhost、端口默认3306、用户名root和你的密码就能像操作 Excel 一样点点点来看数据了。三、 建立领地如何创建一个数据库和一张表连接成功后里面是一片虚无。我们需要通过指令来圈地建楼。1. 圈地创建一个数据库Database一个微服务项目比如电商系统往往独占一个数据库。CREATEDATABASEshop_db;建好之后告诉 MySQL 我们接下来的指令要在哪个领地执行USEshop_db;2. 盖楼创建一张数据表Table现在我们在shop_db库里建一张用于存放用户信息的users表。由于是关系型数据库建表时我们必须严格定义好每一列叫什么、是什么数据类型CREATETABLEusers(idINTAUTO_INCREMENTPRIMARYKEY,-- 1. 主键身份证号自动递增nameVARCHAR(50)NOTNULL,-- 2. 名字最大50个字符的字符串不能为空ageINT,-- 3. 年龄整数类型created_atTIMESTAMPDEFAULTCURRENT_TIMESTAMP-- 4. 注册时间自动填入当前时间);四、 核心深挖彻底厘清库表设计的“黄金四角”在刚才的建表语句中你看到了PRIMARY KEY等字眼。在真实的数据库设计中有四个概念被称为数据架构的“黄金四角”。它们天天出现在建表单里不仅决定了数据的安全更决定了查询的速度。我们继续用通俗的“公司员工档案表”和“新华字典”来做降维类比把它们一次性说透1. 候选键 (Candidate Key) —— 备选的“政审委员”大白话类比在公司的员工档案里哪些信息可以唯一确定一个人绝对不会有第二个人和他在这一项上完全一样方案A你的身份证号全局唯一方案B公司发给你的工号公司内唯一方案C你的手机号通常也是唯一的数据库定义表中的某一个字段或几个字段的组合它能够唯一地标识表中的一条记录。只要这一列的值不重复它就有资格成为候选人。特点一张表里候选键可以有零个或多个。比如上述的“身份证号”、“工号”、“手机号”全是候选键。2. 主键 (Primary Key) —— 最终登基的“真命天子”大白话类比虽然身份证号、工号、手机号都能唯一标识你但公司大总管MySQL嫌麻烦说“我每天要管理几万条数据不能一会儿用身份证查一会儿用手机号查我必须在候选人里挑一个作为全表至高无上的‘一号核心绑定项’” 最终大总管挑中了“工号”这就是主键。数据库定义从众多“候选键”中选出来、作为唯一标识符的那一个字段。铁律一张表有且仅能有一个主键。主键的值绝对不能为空NOT NULL也绝对不能重复。为什么类型不能乱选如果图省事把所有列全设为字符串VARCHAR不仅空间暴涨还无法让数据库去过滤“年龄大于20岁”这种范围比较。同样最推荐的做法是搞一个没有任何业务含义的自增整数id INT AUTO_INCREMENT PRIMARY KEY。AUTO_INCREMENT让它在每次塞入新数据时自动变 1, 2, 3… 无需手动去算它是 MySQL 帮数据在磁盘上建立排列表格的物理依据。3. 唯一键 / 唯一约束 (Unique Key) —— 落选者的“终身爵位”大白话类比工号成功登基成了“主键”。那落选的“身份证号”和“手机号”怎么办呢虽然它们没当上主键但它们的属性依然是唯一的啊总不能允许两个员工填同一个手机号吧大总管说“给它们颁发‘唯一键’称号帮它们加上约束谁要是敢填重复的手机号系统直接报错弹开”数据库定义用来确保表中某一列或多列组合的数据不重复。它与主键的区别主键全表只能有一个而唯一键Unique在一张表里可以设置无数个。主键的值绝对不能为空而唯一键的值允许为空NULL。在 MySQL 中唯一键甚至允许出现多个 NULL 值因为数据库认为“空”和“空”是无法比较、不相等的。4. 索引 (Index) —— 畅游数据海的“新华字典目录”如果说上面三个“键Key”主要是为了做安全约束防止数据重复那么“索引Index”的唯一目的就是为了天下武功唯快不破提升查询速度。大白话类比想象一本 1000 页的《新华字典》里面收录了几万个汉字。如果你想找“张”这个字没有索引全表扫描你必须从第 1 页开始一页一页往后翻直到在第 600 页找到了它。在数据库里这叫Full Table Scan全表扫描数据量一上百万服务器当场卡死。有索引目录查询你先花 2 秒钟翻到字典最前面的《拼音音节索引》找到Z→ \rightarrow→zhang上面写着“第 600 页”。你直接哗啦一下翻到第 600 页。搞定数据库定义索引是数据库管理系统DBMS中一个独立的数据结构MySQL 默认使用的是B 树结构它就像字典的目录默默地把数据排好序放在一旁。天生光环主键、唯一键自带索引你不需要手动去给主键加索引。当你声明PRIMARY KEY或UNIQUE的那一刻MySQL 会自动在后台为这一列创建索引。所以当你在百万级数据中执行SELECT * FROM users WHERE id 9999时由于id是主键有目录可查MySQL 可以耗时0 毫秒瞬间精准揪出结果。 总结一张口诀表彻底打牢地基概念核心目的一张表可以有几个允许重复吗允许为空吗候选键找出有唯一性潜力的列0 个、1 个 或 多个绝不重复绝不能为空主键确定全表的唯一物理标识有且仅能有 1 个绝不重复绝不能为空唯一键防止非主键列的数据录入重复可以有无数个绝不重复允许为空 (NULL)索引像字典目录一样疯狂提速查询可以有无数个视具体索引类型而定视具体列属性而定五、 调遣兵将什么是 SQL掌控生死的 CRUD 基本功我们刚刚写下的CREATE DATABASE、CREATE TABLE属于SQLStructured Query Language结构化查询语言。定义SQL 是人类、你的 Go/Java 程序与关系型数据库沟通的唯一通用普通话。核心分类对于初学者来说你只需率先攻克最核心的四个操作业界俗称CRUD增加、读取、更新、删除就能搞定 80% 的日常开发。下面我们对着刚才建好的users表依次执行 CRUD 指令1. C (Create) - 插入数据INSERT把新数据塞进水库INSERTINTOusers(name,age)VALUES(张三,18);INSERTINTOusers(name,age)VALUES(李四,25);解释往users表里的name和age列分别塞入一条张三(18岁)和李四(25岁)的记录。此时系统会自动为它们分配id1和id2。2. R (Read) - 查询数据SELECT用得最多把数据从水库里捞出来-- 捞出所有人的所有信息* 代表所有列SELECT*FROMusers;-- 条件精准捞只捞大于 20 岁的人的名字SELECTnameFROMusersWHEREage20;运行结果输出模拟------ | name | ------ | 李四 | ------解释WHERE是过滤器。MySQL 扫描全表发现只有“李四”满足大于20岁的条件于是把他的名字摘出来打包返回给客户端。3. U (Update) - 修改数据UPDATE数据变了去表里更新它UPDATEusersSETage19WHEREname张三;运行结果输出模拟Query OK, 1 row affected (0.01 sec) Rows matched: 1 Changed: 1 Warnings: 0 初学者第一死穴千万不要漏掉WHERE如果你写成UPDATE users SET age 19;由于没有指定WHERE过滤器MySQL 会把整张表所有用户的年龄瞬间全部改成 19 岁在生产环境漏写WHERE是直接导致“开除卷铺盖走人”的顶级事故。4. D (Delete) - 删除数据DELETE不需要的数据从表里抹去DELETEFROMusersWHEREname张三; 初学者第二死穴同样千万不要漏掉WHERE如果不加WHERE整张表的所有行数据会被瞬间清空删库跑路的经典现场。六、 进阶序章一条 SQL 的内核奇幻冒险当你已经能在客户端熟练地敲下SELECT * FROM users WHERE id 1并拿到结果时你终于有资格去一窥 MySQL 引擎底层的秘密了。MySQL 的内部其实分成了井然有序的三层架构1. 连接层 (Connection Layer) —— 前台接待员当你的 Go 程序通过 TCP 握手连过来时连接层负责检查你的用户名密码对不对。验证通过后它会从内部的连接池里划拨一个专属线程为你服务维持通信。2. 服务层 (SQL Server Layer) —— 军师与智囊团它拿到你发送的 SQL 语句后主要做三件事解析器检查语法。如果你少写了个分号或拼错了单词这里会直接报错拒绝。优化器关键开动脑筋算计。它会查看你表里有什么索引也就是看字典目录计算出一条“耗时最短、代价最小”的执行路径。执行器根据优化器的方案向底层的苦力发出最终指令。3. 存储引擎层 (Storage Engine Layer) —— 干活的苦力MySQL 的数据最终是写在硬盘文件里的。存储引擎层默认是全行业标准的InnoDB 引擎接收到服务层的指令真正把触手伸向硬盘的 SSD把那行二进制数据捞上来返回或者把新数据擦写进磁盘。 总结与后续剧透恭喜你读到这里你已经平稳、系统地跨过了 MySQL 的大门。此时在你的脑海里主键在当顶梁柱唯一键在抓防重索引在后台开挂提速而一万个并发请求正在通过连接层、服务层向存储引擎层疯狂进发。这只是我们数据库专题的第一步。有了这个坚实的地基接下来我们就要切入最核心、最影响后端程序员薪资的深水区了。欢迎在评论区留下你的脚印你第一次在本地成功安装并连上 MySQL 的时候遇到的第一个报错是什么下一期我们将正式踏入技术面试的绝对核心——《MySQL 核心双子星彻底扒光 B 树索引与事务隔离级别的底层底裤》敬请期待