MySQL
从命令行到模式设计,系统学习 MySQL。涵盖 SQL 基础、连接查询、索引、事务、存储过程、EXPLAIN 分析及运维操作。
共 13 节,按顺序
- 120 分钟
什么是 MySQL
欢迎。如果你此前从没用过数据库,那你来对地方了。这一课没有查询要写。我们只想弄清 MySQL 是什么、从哪儿来、以及什么时候该请它出场。慢慢来就好。
Relational databaseHistory and Oracle ownershipMariaDB forkMySQL vs Postgres trade-offsInnoDB default engine - 225 分钟
MySQL 命令行工具与基础命令
上一课全是纸上谈兵:MySQL 是什么、从哪里来、为什么存在。这些都没法让你真的向服务器问出一个问题。没人能连上的数据库服务器,不过是个白白烧内存的进程。要用 MySQL...
Mysql clientConnecting with -u and -pSHOW DATABASESUSESHOW TABLESDESCRIBE+2 - 330 分钟
创建数据库和表
上一课你做的事情全都只是"看"。你连接上服务器,浏览了系统数据库,又窥探了 MySQL 早已替你建好的一张表。这是熟悉客户端的好办法,但和"拥有一个存放自己数据的地方"完全是两回事。假如你现在要做一个小型网店,那台服务器上没有任何一张表能装你的商品,也不会有人替你建。这一课要讲的,就是从零开始亲手把...
CREATE DATABASECharacter sets and collationCREATE TABLEPRIMARY KEYAUTO_INCREMENTNOT NULL+3 - 430 分钟
数据类型
回头看看上一课里的 products 表,你会注意到每一列都带着类型:INT、VARCHAR(120)、DECIMAL(10, 2)。这些不是摆设。给一列选定的类型决定了 MySQL...
INT and BIGINTDECIMAL vs FLOATVARCHAR vs TEXTBOOLEAN as TINYINTDATE vs DATETIME vs TIMESTAMPENUM+1 - 530 分钟
SELECT 和 WHERE
你的表里有一万条产品,而你要的是 electronics 这个类别里断货的那六条。你以后拿数据库做的每一件事,都是这句话的某个版本: 要这些行、这些列、按这个顺序。SELECT...
SELECT columnsWHEREAND and ORBETWEENINLIKE with % and _+3 - 635 分钟
Joins
用户住在一张表里,他们的订单住在另一张表里,而把一笔订单和下单的人拴在一起的,只有某一列里的一个数字。这种拆分是故意的:它让一个用户的名字只被写下一次,改一处就等于处处都改了。可是只要有人要一个页面,把每位客户和他买的东西并排列出来,你就卡住了,因为那个页面同时需要两张表。
INNER JOINLEFT JOINRIGHT JOINNo FULL OUTER JOINUNION workaroundSelf-join+1 - 730 分钟
聚合与分组
有人来问:EU 这个区域上个季度做得怎么样?他要的不是四千行数据,而是一个数。如果你把四千行全都取到应用代码里再加起来,那你就是用又慢又脆的方式,重写了一遍数据库几毫秒就能原生做完的事。
COUNTSUMAVGMIN and MAXGROUP BYHAVING+2 - 830 分钟
索引
登录接口在两百个测试用户下跑得好好的。上了生产环境,四百万用户,WHERE email = '[email protected]' 要花八秒,而查询本身一个字都没改。这一课要讲的就是这件事的全貌:没人帮忙的话,MySQL 回答这个问题的办法就是把每一行都读一遍,逐行比较。
B-tree indexCREATE INDEXMulti-column index left-prefix ruleUNIQUE indexFULLTEXT indexIndexes hurt write performance - 935 分钟
事务与存储引擎
两条 UPDATE 语句要把二十英镑从 Ada 转给 Bilal。第一条跑完了,连接断了,第二条从未执行,于是二十英镑凭空消失。两条语句本身都没写错。错在它们本该是一件不可分割的事,却成了两件各自独立的事。
InnoDB vs MyISAMSTART TRANSACTIONCOMMITROLLBACKIsolation levelsREPEATABLE READ default+1 - 1035 分钟
存储过程与触发器
系统里的每一笔订单,按规定都要写进审计日志。大部分确实写了。没写的那些,分别来自管理后台、每晚的导入作业,还有某人三月份随手跑过的一个一次性脚本。规则是真的存在,但它是靠应用代码来执行的,而应用代码这东西,得靠每个写入方自己记得去跑。
DELIMITERCREATE PROCEDUREIN and OUT parametersCALLCREATE TRIGGERBEFORE INSERT and AFTER UPDATE+1 - 1135 分钟
EXPLAIN 与查询优化
"这条查询很慢。"这句话你往后一辈子都会听到,而人的第一反应往往是动手瞎改:这里加个索引,那里把联结重写一遍,说不定问题出在 ORDER BY 上。靠猜来调优数据库是很糟的做法,而且完全没必要,因为 MySQL 会直接告诉你它打算怎么执行。EXPLAIN...
EXPLAINType column (ALL, ref, range, eq_ref, const)Key and rows columnsEXPLAIN ANALYZE (MySQL 8+)Adding a missing indexSlow query log - 1225 分钟
mysqldump 与数据库恢复
那个每晚跑的定时作业已经往磁盘上写了八个月文件,没有一个人打开过。那不是备份,那是一个寄托了希望的文件。备份只有在你第一次把它恢复回去、亲眼看到数据回来的那一刻,才真正成为备份,所以这一课在讲别的任何东西之前,先让你故意删掉一个数据库。
MysqldumpRedirecting to .sqlRestoring with mysql client--single-transaction for InnoDB--no-data for schema only--all-databases - 1350 分钟
顶点项目,设计一个电子商务数据库 Schema
到目前为止,每一课都是把一张表递到你手上,让你去查它。真实的工作正好反过来: 有人描述一家商店,而你要决定该有哪些表、哪些关系需要强制约束、删掉一个商品时会发生什么,以及创建一份订单会不会让数据库停在做了一半的状态上。这就是这个结业项目要练的技能。你要从头到尾建起一个小型电商表结构,写一段带事务的下...
Foreign keysON DELETE behaviorIndexes on lookup columnsTransactional order creationEXPLAIN on a real query
用你的语言学习 MySQL
每一节课、测验和导师回复都以你的语言显示。AI 导师会用你提问的语言来回答。
Roles that use MySQL
See how hiring teams interview engineers on MySQL, in production-like environments.
Database Administrator (DBA)
Hire DBAs in real workspaces with PostgreSQL or MySQL, real replication lag, real slow queries and real backups to restore. Live or take-home.
See the interviewBackend Engineer (Go, Rust, Java)
Hire backend engineers in real services with real databases, real concurrency and real latency budgets. Live or take-home, fully recorded.
See the interview