MySQL 数据库使用教程 (2024最新版)

1. MySQL 简介

MySQL 是当前最流行的开源关系型数据库管理系统(RDBMS),自 1995 年诞生以来,凭借轻量、稳定、高兼容性的特性,长期占据全球 Web 应用开发数据库的半壁江山。

核心特点

  • 高性能、高可靠性:专为高并发场景优化,InnoDB 存储引擎提供崩溃自动恢复能力
  • 跨平台支持:无缝运行在 Windows、Linux、macOS 三大主流系统上
  • 灵活的存储引擎:默认推荐 InnoDB(支持事务、行级锁、外键),还有 MyISAM(适合只读场景)可选
  • 完整的 SQL 标准兼容:遵循 SQL92、SQL99 等通用标准,降低学习与迁移成本
  • 全面的 Unicode 支持:通过 utf8mb4 字符集覆盖全部 emoji、生僻字等特殊符号

与 SQLite 对比速查

维度SQLiteMySQL
类型轻量级嵌入式文件数据库成熟的 C/S 架构服务器级数据库
并发能力弱(仅支持读并发、串行写)强(支持高并发读写,可水平扩展)
适用场景移动 App、小型桌面工具、临时缓存中大型 Web 应用、微服务、业务系统核心

2. MySQL 安装与配置

当前(2024年)官方推荐的稳定版本是 MySQL Community Server 8.4 LTS,支持 5 年长期维护,适合生产环境使用。

2.1 原生安装(可选)

适合需要深度定制 MySQL 服务的场景:

  1. MySQL 官网下载中心 选择对应平台的安装包
  2. 按照向导完成安装,重点设置强密码(字母+数字+特殊符号组合,长度≥8位)
  3. 配置字符集与默认引擎

2.2 核心配置优化

无论哪种安装方式,建议优先调整字符集与排序规则,避免后续数据乱码问题。

Linux/macOS 配置文件通常位于 /etc/my.cnf/etc/mysql/my.cnf;Windows 则在安装目录的 my.ini 中:

[client]
# 客户端连接默认字符集
default-character-set = utf8mb4

[mysqld]
# 默认存储引擎(必须设置为 InnoDB)
default-storage-engine = INNODB
# 服务器端存储、传输字符集
character-set-server = utf8mb4
# 服务器端排序规则(unicode_ci 对大小写不敏感,兼容性好)
collation-server = utf8mb4_unicode_ci

修改后需重启 MySQL 服务,再通过 SQL 验证配置是否生效:

-- 进入 MySQL 命令行后执行
SHOW VARIABLES LIKE '%char%';

预期输出(关键项已标绿):

+--------------------------+--------------------------------------+
| Variable_name            | Value                                |
+--------------------------+--------------------------------------+
| character_set_client     | 🔵 utf8mb4                           |
| character_set_connection | 🔵 utf8mb4                           |
| character_set_database   | 🔵 utf8mb4                           |
| character_set_server     | 🔵 utf8mb4                           |
| character_set_system     | utf8mb3                              |
+--------------------------+--------------------------------------+

3. Docker 快速部署(强烈推荐!)

Docker 能一键解决环境差异、端口冲突、数据迁移等问题,是本地开发与快速测试的首选方案。

一键启动命令

运行以下命令即可部署 MySQL 8.4 LTS,记得替换密码

docker run -d \
  --name mysql-local-8.4 \
  -e MYSQL_ROOT_PASSWORD=YOUR_STRONG_PASSWORD_123! \
  -p 3306:3306 \
  -v ./mysql-local-data:/var/lib/mysql \
  --restart=always \
  mysql:8.4 \
  --character-set-server=utf8mb4 \
  --collation-server=utf8mb4_unicode_ci

参数逐行解析

参数/配置项作用说明
-d后台启动容器
--name mysql-local-8.4给容器起一个易记的名称,方便后续操作
-e MYSQL_ROOT_PASSWORD设置 root 用户初始密码(必须配置)
-p 3306:3306端口映射:将宿主机的 3306 端口(左)绑定到容器的 3306 端口(右)
-v ./mysql-local-data数据持久化:将容器内的 MySQL 数据目录挂载到宿主机当前目录下的子文件夹中
--restart=always容器自动重启:Docker 服务重启或容器崩溃后自动拉起
--character-set-server启动时直接设置服务器端字符集,替代手动修改配置文件

验证部署是否成功

  1. 检查容器状态:
    docker ps
  2. 进入容器并连接 MySQL:
    docker exec -it mysql-local-8.4 mysql -u root -p
    输入刚才设置的密码即可进入命令行。

4. Python 连接 MySQL

Python 社区推荐使用 官方驱动 mysql-connector-python,完全遵循 Python DB-API 2.0 规范,兼容性与稳定性最优。

4.1 安装驱动

通过 pip 一键安装:

pip install mysql-connector-python

4.2 基础操作完整示例

包含连接、建表、增删改查、事务提交等核心流程:

import mysql.connector
from mysql.connector import Error

def basic_mysql_operations():
    conn = None
    cursor = None
    try:
        # 1. 建立数据库连接
        conn = mysql.connector.connect(
            host="localhost",
            user="root",
            password="YOUR_STRONG_PASSWORD_123!",
            database="test_db"  # 建议先通过命令行创建 test_db
        )
        if conn.is_connected():
            print("✅ 成功连接 MySQL 数据库")

        # 2. 创建游标(用于执行 SQL)
        cursor = conn.cursor()

        # 3. 创建表(如果不存在)
        create_table_sql = """
        CREATE TABLE IF NOT EXISTS users (
            id VARCHAR(20) PRIMARY KEY,
            name VARCHAR(50) NOT NULL,
            created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
        )
        """
        cursor.execute(create_table_sql)
        print("✅ 表 users 创建/检查完成")

        # 4. 插入单条数据(使用占位符 %s 防 SQL 注入)
        insert_single_sql = "INSERT INTO users (id, name) VALUES (%s, %s)"
        insert_single_value = ("1001", "张三")
        cursor.execute(insert_single_sql, insert_single_value)
        print(f"✅ 插入单条数据,影响行数:{cursor.rowcount}")

        # 5. 批量插入数据(效率更高)
        insert_batch_sql = "INSERT INTO users (id, name) VALUES (%s, %s)"
        insert_batch_values = [
            ("1002", "李四"),
            ("1003", "王五"),
            ("1004", "赵六")
        ]
        cursor.executemany(insert_batch_sql, insert_batch_values)
        print(f"✅ 批量插入数据,影响行数:{cursor.rowcount}")

        # 6. 提交事务(InnoDB 必须显式提交,否则数据不会写入)
        conn.commit()
        print("✅ 事务提交成功")

        # 7. 查询数据
        select_sql = "SELECT * FROM users WHERE created_at >= CURDATE()"
        cursor.execute(select_sql)
        results = cursor.fetchall()
        print("\n📋 今日新增的用户:")
        for row in results:
            print(f"ID: {row[0]}, 姓名: {row[1]}, 创建时间: {row[2]}")

    except Error as e:
        print(f"❌ MySQL 操作出错:{e}")
        # 回滚事务(出错时撤销所有未提交的操作)
        if conn and conn.is_connected():
            conn.rollback()
            print("⚠️ 事务已回滚")
    finally:
        # 8. 关闭资源(必须按顺序先关闭游标,再关闭连接)
        if cursor and cursor.is_connected():
            cursor.close()
        if conn and conn.is_connected():
            conn.close()
            print("\n🔌 数据库连接已关闭")

if __name__ == "__main__":
    basic_mysql_operations()

5. 日常开发最佳实践

5.1 安全防护

  1. 禁止直接使用 root 用户:生产环境创建专用读写/只读用户,限制 IP 访问权限
  2. 必须使用占位符:绝对不要拼接 SQL 字符串,防止 SQL 注入攻击
  3. 加密敏感连接:生产环境配置 SSL/TLS 加密,避免数据在传输过程中被窃取
  4. 定期备份数据:可以使用 mysqldump 或 Docker 挂载目录的方式实现

5.2 性能优化

  1. 使用连接池:避免频繁创建/销毁数据库连接,推荐 mysql-connector-python 自带的连接池
  2. 合理设计索引:给常用的查询条件(如 WHEREJOINORDER BY)字段加索引
  3. 批量操作:用 executemany 替代多次 execute,用单个 SQL 替代多个拆分的 SQL
  4. 避免全表扫描:不要用 SELECT * 查询不需要的字段,不要用 LIKE '%xxx' 开头的模糊查询

6. 总结

  • MySQL 8.4 LTS 是目前的首选版本,提供长期稳定的支持
  • Docker 是本地开发与快速测试的最佳部署方式,优先使用
  • Python 操作 MySQL 要使用官方驱动,必须注意事务提交与资源释放
  • 日常开发要遵守安全与性能规范,避免踩坑

7. 扩展阅读