尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

MySQL 8.0入门学习笔记:架构原理、存储引擎与建库建表实操

MySQL 8.0入门学习笔记:架构原理、存储引擎与建库建表实操 2026年3月2日我正式把MySQL从“会敲几条select”提升到“系统学一遍”的计划提上日程。第一章分了好几个小节今天就完成了前两节趁热把笔记整理出来。一方面是给自己留个回看的索引另一方面是给同样在入门MySQL的朋友一条能照着走的路。这篇笔记覆盖的内容不贪多第一节是认识MySQL本身包括它的整体架构、存储引擎以及一条SQL语句从发出去到返回结果中间走的路第二节是环境安装和建库建表实操核心目标就是让你在自己电脑上把一个能用的MySQL跑起来并且能用命令行完成最基础的操作。后面几节的内容我还没学完这篇只写到前两节但足够你把地基打牢。1. 先交代一下这份笔记写给谁、覆盖到哪1.1 为什么是MySQL而不是Oracle或者PostgreSQL入门数据库选MySQL我觉得是当下综合成本最低的选择。Oracle功能很强但商业授权贵个人学习还得找特殊渠道下载精力全耗在环境上PostgreSQL近几年的风头确实猛但它的很多高级特性对新手来说理解门槛偏高。MySQL开源免费、资料多、社区活跃国内互联网公司的存量项目里占比极高学完以后不管进哪家公司大概率都能直接用上。MySQL本质上是关系型数据库管理系统数据以行和列组织成二维表通过SQL语句来操作。它采用客户端/服务器模式你本机敲的命令会通过网络或本地socket发给mysqld服务进程服务处理完再把结果集返回给客户端。理解这一点后续排查连接类问题会轻松很多。1.2 版本选型8.0还是5.7我直接选了8.0版本原因很简单5.7已经停止维护而8.0是官方主推的长期支持版本。8.0相比5.7多了几个很实用的能力比如窗口函数、公共表表达式CTE默认字符集也换成了utf8mb4不再需要手动去改配置才能存emoji。认证插件默认是caching_sha2_password安全性更高但副作用是旧版图形客户端直连会报错这个后面专门讲。如果你公司还在用5.7那学完8.0再回头用5.7也不会太别扭大部分SQL语法一致差异主要在管理命令和部分性能特性上。我这份笔记所有命令都基于8.0。1.3 前两节的学习目标第一节理解MySQL的逻辑架构能讲清楚一条SQL是怎么被解析、优化、执行到返回结果的理解InnoDB和MyISAM的核心差异知道为什么默认引擎是InnoDB。第二节完成安装配置能启动服务并用命令行登录能创建库、创建表、插入和查询数据看懂常用数据类型知道建表时字段类型大概怎么选。这两件事做完你就能自信地往下走因为后面学索引、事务、锁时所有实操都要依赖一个能跑的MySQL环境。2. 第1节重点MySQL到底是个什么东西2.1 从“关系型数据库”这个词说起关系型数据库的“关系”指的就是表与表之间的关联。比如学生表(student)和成绩表(score)成绩表里通过student_id关联学生表这就是典型的一对多关系。这种规范化存储的好处是数据不冗余、修改方便、完整性好控制。学习MySQL之前我建议先把几个核心概念钉死库(database)是表的集合表(table)由行和列组成行也叫记录列也叫字段每个字段都有数据类型比如整数、字符串、日期表通常还要定义主键(primary key)用来唯一标识一行记录。这些概念在后面的所有章节里都会反复出现。2.2 逻辑架构一条SQL从进入到出结果的路学习架构不是纸上谈兵它直接决定了你后面排查问题时的思路。MySQL的逻辑架构可以分成四层连接层负责处理客户端连接、权限校验和连接管理。你输入mysql -uroot -p的时候第一步就是在这里验证身份。服务层包含解析器、优化器等核心组件。SQL在这里被拆词、语法分析再由优化器决定用哪个索引、以什么顺序连接表。存储引擎层负责数据的读写。InnoDB、MyISAM都在这一层它们插件式存在表级别可以指定不同引擎。存储层数据最终落在文件系统上比如ibd文件存储InnoDB的表数据和索引。一条SELECT语句的完整旅程是这样的先经过连接器验证账号权限然后到分析器做词法分析和语法分析把SQL拆成结构树再到优化器决定执行计划比如全表扫描还是走索引最后由执行器调用存储引擎接口一行一行取数据返回客户端。在8.0里查询缓存已经被彻底移除所以不用再考虑“SQL没变是不是会走缓存”这种问题。2.3 InnoDB和MyISAM默认引擎为什么是它初学阶段最容易产生疑惑的就是存储引擎。我用一个表格把两者核心差异列出来方便对照特性InnoDBMyISAM事务支持支持ACID完整不支持锁粒度行级锁表级锁外键支持不支持崩溃恢复支持redo log保证不支持损坏修复麻烦缓存缓冲池缓存索引和数据只缓存索引全文索引5.6以后支持支持适用场景读写频繁、事务型业务只读、报表类场景InnoDB是默认引擎核心原因是它支持事务和行级锁这对现代业务几乎就是刚需。多用户同时更新一条数据时MyISAM会锁住整张表写入并发一高就排队InnoDB只锁对应行其他行的读写不受影响。你可以在建表时用ENGINEInnoDB显式指定也可以查看当前默认引擎SHOW VARIABLES LIKE default_storage_engine;3. 第2节重点从零装一个MySQL 8.03.1 Windows环境安装下载、配置、初始化一条线官网下载Windows安装包时有两个方向一个是MySQL Installer图形化向导适合新手另一个是ZIP压缩包手动配置适合想搞懂每一步的人。我建议新手直接走Installer全程下一步即可但有三个环节必须盯紧。第一选安装类型时第一个界面不要直接点Full先改选Server only减少不必要的组件安装。第二配置Type and Networking时端口保持3306除非你本机确实被占用再改。第三到Authentication Method这一步选“Use Strong Password Encryption”即caching_sha2_password这是8.0默认方案但要注意旧版Navicat连不上。第四设置root密码我建议至少8位包含大小写字母和数字否则过不了密码策略校验。整个过程装完后打开控制面板里的服务找到MySQL80确认状态是“正在运行”。然后在命令行输入mysql -uroot -p输入刚才的密码出现Welcome to the MySQL monitor提示就说明安装成功。3.2 Linux环境安装包管理器与离线rpmLinux下安装更贴近生产环境。Ubuntu/Debian系直接用aptsudo apt update sudo apt install mysql-server -yCentOS/RHEL系用包管理器sudo dnf install mysql-server -y sudo systemctl start mysqld sudo systemctl enable mysqld注意CentOS仓库里默认的mysql-community-server版本可能不是最新你想指定版本的话需要先配置MySQL官方yum源sudo rpm -Uvh https://dev.mysql.com/get/mysql80-community-release-el9-1.noarch.rpm sudo dnf install mysql-community-server -y离线安装是另一个常见场景步骤是先去官网下载rpm包一般需要mysql-community-common、libs、client、server这几个按依赖顺序安装sudo rpm -ivh mysql-community-common-*.rpm sudo rpm -ivh mysql-community-libs-*.rpm sudo rpm -ivh mysql-community-client-*.rpm sudo rpm -ivh mysql-community-server-*.rpmrpm包版本必须匹配混装不同大版本会直接报依赖冲突。装完以后启动前先初始化数据目录sudo mysqld --initialize这一步会生成data目录和初始密码初始密码的位置后面单独讲。3.3 第一次启动验证服务、找初始密码、登进去服务启动后第一件事就是验证端口和进程systemctl status mysqld ss -ltn | grep 3306看到LISTEN状态说明服务正常。Linux下用rpm安装初始密码一般写在日志里sudo grep temporary password /var/log/mysqld.log如果日志路径不同可以去/etc/my.cnf里看log-error的配置。拿到临时密码后登录mysql -uroot -p然后立刻改密码。8.0默认带了密码策略插件你设置简单密码会报错第一次可以先把策略调低再改ALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY 你的新密码; SET GLOBAL validate_password.policy LOW; ALTER USER rootlocalhost IDENTIFIED BY 123456;注意第二行SQL刚才已经能用但如果一开始就设简单密码建议先执行策略调整再ALTER USER顺序不要反。4. 第2节实操建库、建表、把常用命令用熟4.1 建库建表完整示例环境跑通之后实操才真正开始。我建议你跟着做一个最简单也最经典的学生信息表走一遍完整流程。创建数据库CREATE DATABASE school CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;这里必须显式指定字符集别偷懒只写CREATE DATABASE school的话会继承服务器默认值如果默认是latin1后面存中文就是一堆问号。切换到当前库并建表USE school; CREATE TABLE student ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(32) NOT NULL, age INT DEFAULT 0, birthday DATE, create_time DATETIME DEFAULT CURRENT_TIMESTAMP ) ENGINEInnoDB;建表语法很直观但有几个点要解释一下。AUTO_INCREMENT表示自增主键每次插入不传id会自动生成省去业务侧管理ID的麻烦。DEFAULT 0和DEFAULT CURRENT_TIMESTAMP给字段设置默认值后面插入数据时这些字段可以省略。ENGINEInnoDB显式指定存储引擎避免依赖全局默认值。检查表结构DESC student; SHOW CREATE TABLE student;插入几条数据INSERT INTO student (name, age, birthday) VALUES (张三, 20, 2006-03-01); INSERT INTO student (name, age, birthday) VALUES (李四, 21, 2005-06-15);查询验证SELECT * FROM student;到这里你已经完成了MySQL入门阶段最重要的一次闭环建库、建表、写数据、读数据。4.2 数据类型很多人一开始就在char和varchar上栽跟头建表最考验功底的不是SQL语法而是字段类型。我把自己总结的判断逻辑分享出来。整数类型的选型要看数据范围TINYINT占1字节适合布尔值、状态码0和1SMALLINT占2字节适合枚举类型编号INT占4字节业务主键的绝对大头BIGINT占8字节适合雪花ID、流水号。你不需要背每个范围的具体数字但要记住选类型的原则是够用且略有余量不要所有字段都无脑用BIGINT存储空间和索引性能都会受影响。字符串类型最容易被误解。CHAR(n)是定长比如CHAR(10)无论存多短都占10个字符的空间适合长度往往固定不变的字段如MD5值、手机号VARCHAR(n)是变长最大长度为n实际存储占用是内容长度加一些额外字节适合名称、地址这类长度波动的字段。VARCHAR的括号数字是最大字符数不是字节数在utf8mb4字符集下一个汉字占3字节所以VARCHAR(255)实际最多能存255个汉字约765字节。日期类型里DATETIME和TIMESTAMP是二元选择。DATETIME范围大、不带时区适合记录业务时间TIMESTAMP带时区范围到2038年适合事件时间戳。建议业务表统一用DATETIME加默认CURRENT_TIMESTAMP简单不容易错。4.3 前两节必须眼熟的命令清单初学阶段最痛苦的是命令记不住我把前两节必须眼熟的整理成一张速查表抄下来或者记在笔记里都行命令作用SHOW DATABASES;查看所有数据库USE 库名;切换数据库SHOW TABLES;查看当前库所有表DESC 表名;查看表结构SHOW CREATE TABLE 表名;查看建表语句CREATE DATABASE 库名;建库CREATE TABLE 表名(...);建表INSERT INTO 表名 VALUES(...);插入记录SELECT * FROM 表名;查询所有记录SELECT DATABASE();查看当前所在库5. 我踩过的坑安装与连接阶段最容易翻车的5个问题5.1 ERROR 2002连不上socket的完整排查链路这是一个几乎每个MySQL新手都会遇到的报错ERROR 2002 (HY000): Cant connect to local MySQL server through socket /tmp/mysql.sock (2)我第一次看到这个错误时以为密码错了折腾了半天才发现问题根本不在密码。这个错误的本质是你执行mysql -uroot -p时客户端默认通过socket文件连接本地mysqld进程但socket文件不存在或者服务没启动。排查链路我建议按顺序走。第一步确认服务是否在运行systemctl status mysqldWindows下打开服务管理器看MySQL服务状态。服务没启动时会出现这个错误启动服务就好。第二步确认socket文件路径。8.0的socket文件不一定在/tmp下可能配置到了/var/run/mysqld/mysqld.sock。你可以去/etc/my.cnf或mysqld的配置里查socket参数。如果文件存在但路径不同连接时显式指定mysql -uroot -p -S /var/run/mysqld/mysqld.sock第三步如果服务在跑、socket路径也对但还是报错那可能文件权限有问题。mysqld进程和客户端用户权限不一致导致无法访问。另外也可以用TCP方式绕过socketmysql -h127.0.0.1 -P3306 -uroot -p这个命令强制走TCP协议适合socket链路异常时的临时验证。5.2 初始密码找不到以及密码策略太强怎么办Linux下通过mysqld --initialize生成初始密码后如果你没注意日志位置很可能找不到。不同版本的日志路径不太一样我建议两条命令一起试sudo grep temporary password /var/log/mysqld.log sudo grep temporary password /var/log/mysql/mysql.log如果两个文件都没有检查/etc/my.cnf里log_error参数指定的路径。实在不行通过配置文件跳过认证进入再手动重置编辑/etc/my.cnf在[mysqld]段下加skip-grant-tables。重启mysqld服务。执行mysql -uroot这时候不用密码直接进。执行FLUSH PRIVILEGES;然后ALTER USER把密码改掉。删掉配置文件里的skip-grant-tables重启服务。这个方法能解决问题但skip-grant-tables会让MySQL完全放开认证线上环境绝不能这么干只适合本机应急。改完密码后一定记得去掉。5.3 图形客户端连接报错SSL与认证插件用Navicat等图形工具连接MySQL 8.0最常见的报错是Authentication plugin caching_sha2_password cannot be loaded原因就是8.0默认认证插件和旧版客户端的兼容性问题。解决思路有两条。第一条是升级客户端到支持caching_sha2_password的新版本这是最推荐的做法第二条是把用户认证插件改成mysql_native_passwordALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY 密码;改完后客户端就能正常连上但要注意这会降低账号的安全级别。前面提到我再三确认过如果本机仅仅是学习环境改一下问题不大如果是生产环境升级客户端是唯一正解。SSL连接错误也常见。部分客户端默认开启SSL而服务器可能没配证书或客户端版本不匹配。这类错误通常在连接设置里把Use SSL改成If available或者Disabled就能解决学习场景下数据链路全在本机不加密影响不大。5.4 字符集不改后面全是乱码中文乱码的问题是字符集不一致导致的。排查思路是检查三处位置服务器端、数据库/表、客户端连接。服务器端全局字符集用这个命令看SHOW VARIABLES LIKE character_set_server;如果是latin1修改/etc/my.cnf在[mysqld]下加character-set-serverutf8mb4 collation-serverutf8mb4_general_ci然后重启服务。数据库和表在建的时候指定字符集最省事建库时没指定的可以用ALTER语法制止ALTER DATABASE school CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; ALTER TABLE student CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;客户端连接时也可以显式指定SET NAMES utf8mb4;我自己的习惯是所有建库建表语句都把字符集写清楚不依赖服务器默认值这样换环境也不会出问题。5.5 端口和防火墙导致的远程连接失败本地连接没问题换一台机器就连不上基本就是端口或权限问题。先确认监听地址MySQL默认只监听127.0.0.1配置了bind-address 0.0.0.0才能被外部机器访问。然后是防火墙。CentOS上要放行3306sudo firewall-cmd --zonepublic --add-port3306/tcp --permanent sudo firewall-cmd --reload云服务器还要记得在安全组里放行3306端口。最后是账号权限问题远程连接不能用rootlocalhost账号要创建允许任意主机访问的账号CREATE USER leo% IDENTIFIED BY 密码; GRANT ALL PRIVILEGES ON *.* TO leo%; FLUSH PRIVILEGES;生产环境不建议给%开放所有权限按业务最小化授权。6. 前两节之外的扩展后面章节要啃的东西6.1 先说清楚int(5)这个高频疑问热搜词里有“mysql中int5”这个我理解很多人在建表时会遇到一个困惑int(5)是不是表示最多只能存5位数。我特意查过文档这个答案是明确的——不是。int(5)的“5”叫显示宽度它的作用只有一个配合ZEROFILL属性在数值位数不足5位时左侧补0。比如int(5) ZEROFILL存入123查询结果是00123。它不影响能存储的最大值int类型固定占4字节范围是-2147483648到2147483647。这一点必须在初学阶段就搞清楚因为很多所谓“数据被截断”的报错根因往往是类型范围不够而不是显示宽度没设够。从8.0.17版本开始官方已经不建议在整数类型上指定显示宽度这个语法后续大概率会废弃。所以建表时直接写INT就行不要在后面加括号。6.2 从索引、事务到锁第二章的路线预告这篇笔记只覆盖前两节但热搜词里暴露了大家实际关注的进阶方向mysql存储过程、mysql锁原理、mysql事务处理、mysql性能调优、主从复制。这些恰好是接下来章节的内容我先把路线捋清楚。第二章大概率会讲SQL进阶包括多表连接、子查询、聚合函数和常用函数比如字符串函数、日期函数这也对应热搜里的mysql常用函数。然后是索引这是性能调优的核心重点理解BTree结构、聚簇索引和二级索引、最左前缀原则。之后再进入事务和锁理解ACID、隔离级别、行锁与间隙锁的触发条件。这些内容都在前两节铺的地基上展开环境没问题后面就能反复实操验证。我自己学的时候有个很强烈的体会第一章前两节的安装和建表看似简单但决定了后面的学习效率。很多人学到索引和锁的时候还在为环境问题头疼就是因为前面没有把连接原理、字符集、权限这几件事理顺。如果你看完这篇笔记能独立完成安装配置并且把student表建出来第一章前两节就算真正过关了。后面等我把剩余章节学完会继续整理成同样的笔记风格发出来每篇都按实操来写有报错就给排查思路有参数就给推导过程不搞那种看似高深、实际用不上的空理论。
返回列表