MySQL 系列:第1篇 数据库时代与MySQL
IT策士 10余年一线大厂经验专注 IT 思维、架构、职场进阶。我会在各个平台持续发布最新文章助你少走弯路。1. 为什么需要数据库在软件开发中数据是核心资产。最早的程序把数据直接写在文件里但随着系统越来越复杂文件存储暴露出三大问题并发冲突多个用户同时修改同一份文件数据容易损坏查询低效从几万行里找出满足条件的记录只能全文件扫描一致性难保证转账操作“扣钱”和“加钱”两步可能只执行了一半数据库正是为了解决这些痛点而诞生的。它提供了一套可靠、高效、安全的数据管理方案。2. 关系型数据库的核心概念关系型数据库RDBMS把数据组织成表Table表由**行Row和列Column**构成就像 Excel 表格一样。行代表一个实体比如“一个学生”列代表实体的属性比如“姓名”、“年龄”主键Primary Key唯一标识一行数据比如“学号”SQLStructured Query Language操作数据库的统一语言无论底层是哪种数据库SQL 都大致相同关系型数据库通过关系来连接不同的表。例如“学生表”和“成绩表”可以通过“学号”关联查询出“张三的所有成绩”。这种模型理论扎实、应用广泛是目前最主流的数据库类型。3. MySQL 是什么为什么选择它MySQL 是目前最受欢迎的开源关系型数据库之一。它最初由瑞典的 MySQL AB 公司开发后来被 Sun、Oracle 相继收购。尽管归属于 OracleMySQL 社区版仍然免费、开源拥有庞大的用户群体。MySQL 的突出优势开源免费社区版自由使用降低企业成本性能强劲插件式存储引擎架构InnoDB 引擎支持事务、行级锁适合高并发 OLTP 场景简单易用安装轻量学习曲线平缓5 分钟即可上手生态完善丰富的监控、备份、高可用工具如 XtraBackup、Orchestrator、ProxySQL云原生友好各大云厂商均提供托管 MySQL 服务RDS自动运维版本演变与选择MySQL 5.7 是上一个长期稳定版至今仍有大量项目使用。MySQL 8.0是目前的主流版本带来了众多关键改进窗口函数、CTE公用表表达式让复杂查询更简单原子 DDL、降序索引增强JSON 数据类型与函数大幅完善默认字符集变为 utf8mb4彻底告别表情符号乱码本系列文章均基于MySQL 8.0展开。如果你还在用 5.7建议尽早升级体验现代 SQL 的开发效率。4. 环境搭建5 分钟拥有自己的 MySQL我们将使用 Docker 来快速安装 MySQL 8.0避免系统环境污染。如果你还没安装 Docker请先访问 docker.com 下载对应的桌面版本。步骤 1拉取并启动 MySQL 容器打开终端执行以下命令dockerrun-d\--namemysql8\-p3306:3306\-eMYSQL_ROOT_PASSWORDMyNewPass123!\mysql:8.0预期输出Docker 会打印一个长字符串容器 ID表示启动成功。你可以用docker ps查看运行中的容器。动手试试如果你不想用 Docker也可以直接去 MySQL 官网 下载安装包。安装后记得将 MySQL 的bin目录加入系统 PATH。步骤 2使用命令行客户端连接容器启动后进入容器内部使用mysql客户端dockerexec-itmysql8 mysql-uroot-pMyNewPass123!预期输出mysql:[Warning]Using a password on thecommandline interface can be insecure. Welcome to the MySQL monitor. Commands end with;or\g. Your MySQL connectionidis9Server version:8.0.35 MySQL Community Server - GPL... mysql出现mysql提示符说明连接成功执行第一条 SQL 语句查看数据库列表预期输出--------------------|Database|--------------------|information_schema||mysql||performance_schema||sys|--------------------4rowsinset(0.00sec)这四个库是 MySQL 的系统库用来存储元数据、权限、监控指标等千万不要删除它们。5. Python 连接 MySQL让代码与数据库对话接下来我们用 Python 来操作 MySQL打通“编程语言 ↔ 数据库”的链路。安装 Python 连接器我们选择官方推荐的mysql-connector-python驱动它是纯 Python 实现无需额外安装 C 依赖。pipinstallmysql-connector-python预期输出Collecting mysql-connector-python Downloading mysql_connector_python-8.3.0-cp310-cp310-manylinux_2_17_x86_64.whl... Installing collected packages: mysql-connector-python Successfully installed mysql-connector-python-8.3.0建立连接并执行第一个查询创建文件01_first_connection.pyimportmysql.connector# 1. 建立连接connmysql.connector.connect(host127.0.0.1,port3306,userroot,passwordMyNewPass123!,databasemysql# 先连接系统库)# 2. 创建游标cursorconn.cursor()# 3. 执行查询cursor.execute(SELECT host, user FROM user LIMIT 5)# 4. 获取结果forrowincursor.fetchall(): print(row)# 5. 关闭资源cursor.close()conn.close()运行代码python 01_first_connection.py预期输出结果可能略有差异(%,root)(localhost,mysql.infoschema)(localhost,mysql.session)(localhost,mysql.sys)(localhost,root)这段代码演示了数据库操作的五个标准步骤连接 → 游标 → 执行 → 取结果 → 关闭。处理连接异常最佳实践生产环境中网络抖动或密码错误很常见必须捕获异常importmysql.connector from mysql.connectorimportError config{host:127.0.0.1,port:3306,user:root,password:MyNewPass123!,database:mysql}try: connmysql.connector.connect(**config)ifconn.is_connected(): print(✅ 连接成功)cursorconn.cursor()cursor.execute(SELECT VERSION())versioncursor.fetchone()print(fMySQL 版本: {version[0]})except Error as e: print(f❌ 连接失败: {e})finally:ifconn.is_connected(): cursor.close()conn.close()print(连接已关闭)预期输出✅ 连接成功 MySQL 版本:8.0.35 连接已关闭常见误区很多新手会把数据库密码硬编码在代码里甚至提交到 Git。开发时可以使用环境变量os.getenv(MYSQL_PASSWORD)来管理敏感信息后续文章会详细介绍。6. 创建第一个业务数据库和表现在我们脱离系统库创建属于自己的数据库并用 Python 管理。创建数据库和表importmysql.connector connmysql.connector.connect(host127.0.0.1,port3306,userroot,passwordMyNewPass123!)cursorconn.cursor()# 创建数据库cursor.execute(CREATE DATABASE IF NOT EXISTS myblog DEFAULT CHARSET utf8mb4)# 切换到该数据库cursor.execute(USE myblog)# 创建用户表create_table_sql CREATE TABLE IF NOT EXISTSusers(idINT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50)NOT NULL UNIQUE, email VARCHAR(100)NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP)ENGINEInnoDB DEFAULTCHARSETutf8mb4 cursor.execute(create_table_sql)print(数据库和表创建成功)cursor.close()conn.close()预期输出插入和查询数据importmysql.connector connmysql.connector.connect(host127.0.0.1,port3306,userroot,passwordMyNewPass123!,databasemyblog)cursorconn.cursor()# 插入新用户insert_sqlINSERT INTO users (username, email) VALUES (%s, %s)users[(alice,aliceexample.com),(bob,bobexample.com),(charlie,charlieexample.com)]cursor.executemany(insert_sql,users)conn.commit()# 提交事务print(f插入了 {cursor.rowcount} 条记录)# 查询所有用户cursor.execute(SELECT id, username, email, created_at FROM users)print(\n用户列表)forrowincursor.fetchall(): print(row)cursor.close()conn.close()预期输出插入了3条记录 用户列表(1,alice,aliceexample.com, datetime.datetime(2025,1,15,12,0,1))(2,bob,bobexample.com, datetime.datetime(2025,1,15,12,0,1))(3,charlie,charlieexample.com, datetime.datetime(2025,1,15,12,0,1))这里有几个关键点参数化查询%s是占位符而不是 Python 的字符串格式化%。这样可以防止 SQL 注入并处理不同数据类型的转义。事务提交INSERT、UPDATE、DELETE 操作后必须调用conn.commit()才会持久化否则关闭连接时自动回滚。executemany批量插入远比循环单条插入高效能大幅减少网络交互次数。7. MySQL 架构初览文字流程图理解 MySQL 的宏观架构能帮助你在后面的学习中明白每一步优化是作用在哪个层面。客户端(Python / Java / CLI)↓ 连接/线程处理层 ← 连接池管理、认证授权 ↓ 查询缓存(8.0已移除)↓ 解析器 → 生成解析树 ↓ 优化器 → 选择索引、重写查询、决定 JOIN 顺序 ↓ 执行器 → 调用存储引擎接口 ↓ 存储引擎层(InnoDB / MyISAM / Memory …)↓ 磁盘(数据文件、日志文件)连接层负责与客户端通信每个连接对应一个线程。服务层SQL 的核心大脑包括解析、优化、执行计划生成。引擎层负责数据的实际存储和读取插件式设计使 MySQL 可以灵活切换存储方式。InnoDB 是默认引擎支持事务。思考为什么我们写的 SQL 相同执行时间有时差别巨大因为优化器在不同的数据量、索引条件下会选择不同的执行路径。理解优化器的工作原理是 SQL 调优的关键本系列后续章节会深度展开。8. 动手试试修改条件观察变化现在请你在上面的插入代码基础上完成以下练习插入一个 username 为 “alice” 的用户。运行程序观察会输出什么为什么会这样提示用户名设置了 UNIQUE 约束。修改 SELECT 语句只查询 email 以 “example.com” 结尾的用户并按 id 降序排列。预期输出应该显示 3 条记录顺序为 charlie → bob → alice。使用cursor.execute(SELECT VERSION())查看 MySQL 版本号确认你安装的是 8.0 系列。如果你还没搭建好环境现在是动手的最佳时机。这个环境将贯穿整个系列教程。今天我们迈出了 MySQL 学习的第一步从“数据库为何存在”开始了解了关系型模型、MySQL 的定位与优势并通过 Docker 快速搭建了实验环境最后用 Python 完成了连接、建库、建表、增删查的全流程。下一篇文章我们将深入库和表的设计学习数据类型、约束与字符集的底层细节。想了解更多还可以去各个平台搜索「IT策士」一起升级 IT 思维