Skip to content

MySQL

简介

MySQL是世界上最流行的开源关系型数据库管理系统之一,以其可靠性、性能和易用性而闻名。它采用客户端-服务器架构,支持多种存储引擎,广泛应用于Web应用、企业应用和云服务等领域。

核心特性

架构特点

  • 多存储引擎: InnoDB、MyISAM、Memory等
  • 插件式架构: 可扩展功能模块
  • 主从复制: 数据同步与读写分离
  • 分区表: 逻辑数据分割管理

数据类型

  • 数值类型: INT, DECIMAL, FLOAT等
  • 字符串类型: VARCHAR, TEXT, CHAR等
  • 时间日期类型: DATETIME, DATE, TIMESTAMP等
  • 二进制类型: BLOB, BINARY等
  • JSON类型: 原生JSON数据支持(5.7+)

存储引擎

InnoDB

  • ACID事务: 完整事务支持
  • 行级锁定: 高并发性能
  • 外键约束: 参照完整性
  • 崩溃恢复: 自动恢复能力
  • 缓冲池: 内存数据缓存

MyISAM

  • 全文索引: 文本搜索能力
  • 表级锁: 简单锁机制
  • 压缩表: 静态只读表压缩
  • 无事务支持: 性能优先

Memory

  • 内存表: 极速访问
  • 哈希索引: 快速查找
  • 临时数据: 会话级数据

索引技术

索引类型

  • B+树索引: 默认索引结构
  • 哈希索引: Memory引擎支持
  • 全文索引: 文本搜索优化
  • 空间索引: 地理数据索引

索引设计原则

  • 选择性原则: 高区分度字段
  • 最左前缀: 复合索引使用规则
  • 索引覆盖: 减少回表操作
  • 适度原则: 避免过多索引

常见索引问题

  • 索引失效: 函数使用、隐式转换
  • 回表查询: 二次访问成本
  • 索引更新开销: 写入性能影响
  • 索引碎片: 性能降低因素

事务与并发

事务特性

  • 原子性(Atomicity): 全部完成或全部回滚
  • 一致性(Consistency): 保持数据完整性
  • 隔离性(Isolation): 事务间互不干扰
  • 持久性(Durability): 提交后永久保存

隔离级别

  • 读未提交(Read Uncommitted): 脏读风险
  • 读已提交(Read Committed): 不可重复读风险
  • 可重复读(Repeatable Read): 幻读风险
  • 可串行化(Serializable): 完全隔离

锁机制

  • 共享锁(S锁): 读锁,允许并发读
  • 排他锁(X锁): 写锁,阻止其他访问
  • 意向锁: 表级锁定效率提升
  • 间隙锁: 防止幻读的范围锁
  • 行锁、表锁: 不同粒度的锁定

高可用与扩展性

主从复制

  • 异步复制: 标准复制模式
  • 半同步复制: 提高数据安全性
  • 组复制: 多主一致性协议
  • 延迟复制: 灾难恢复保护

高可用方案

  • MySQL主从切换: 手动/自动故障转移
  • MySQL Cluster: NDB集群存储
  • MySQL InnoDB Cluster: 组复制架构
  • ProxySQL/MySQL Router: 负载均衡

分片与分区

  • 水平分片: 跨实例数据拆分
  • 垂直分片: 按功能拆分表
  • RANGE分区: 范围分区
  • LIST分区: 列表分区
  • HASH分区: 哈希分布
  • KEY分区: 键值分布

性能优化

查询优化

  • 执行计划分析: EXPLAIN命令
  • 索引优化: 合理创建与使用索引
  • JOIN优化: 小表驱动大表
  • 子查询优化: 转化为JOIN
  • LIMIT优化: 避免深分页问题

配置优化

  • 缓冲池大小: innodb_buffer_pool_size
  • 日志缓冲区: innodb_log_buffer_size
  • 并发连接数: max_connections
  • 临时表大小: tmp_table_size
  • 排序缓冲: sort_buffer_size

架构优化

  • 读写分离: 分担读负载
  • 缓存层: 应用缓存减轻压力
  • 慢查询分析: 识别性能瓶颈
  • 合理分区: 减少扫描数据量

代码示例

基本连接与查询(PHP)

php
<?php
// 创建连接
$mysqli = new mysqli("localhost", "username", "password", "database");

// 检查连接
if ($mysqli->connect_errno) {
    echo "Failed to connect to MySQL: " . $mysqli->connect_error;
    exit();
}

// 执行查询
$sql = "SELECT id, name, email FROM users WHERE status = 'active' LIMIT 10";
$result = $mysqli->query($sql);

// 处理结果
if ($result->num_rows > 0) {
    while($row = $result->fetch_assoc()) {
        echo "ID: " . $row["id"] . " - Name: " . $row["name"] . " - Email: " . $row["email"] . "<br>";
    }
} else {
    echo "0 results";
}

// 关闭连接
$mysqli->close();
?>

事务处理(Node.js)

javascript
const mysql = require('mysql2/promise');

async function transferFunds(fromAccount, toAccount, amount) {
  // 创建连接池
  const pool = mysql.createPool({
    host: 'localhost',
    user: 'username',
    password: 'password',
    database: 'bank',
    waitForConnections: true,
    connectionLimit: 10
  });
  
  const conn = await pool.getConnection();
  
  try {
    // 开始事务
    await conn.beginTransaction();
    
    // 检查余额
    const [rows] = await conn.query('SELECT balance FROM accounts WHERE id = ? FOR UPDATE', [fromAccount]);
    if (rows.length === 0 || rows[0].balance < amount) {
      throw new Error('Insufficient funds');
    }
    
    // 从源账户扣款
    await conn.query('UPDATE accounts SET balance = balance - ? WHERE id = ?', [amount, fromAccount]);
    
    // 向目标账户加款
    await conn.query('UPDATE accounts SET balance = balance + ? WHERE id = ?', [amount, toAccount]);
    
    // 记录交易
    await conn.query(
      'INSERT INTO transactions (from_account, to_account, amount, transaction_date) VALUES (?, ?, ?, NOW())',
      [fromAccount, toAccount, amount]
    );
    
    // 提交事务
    await conn.commit();
    
    return { success: true, message: 'Transfer completed successfully' };
  } catch (error) {
    // 回滚事务
    await conn.rollback();
    return { success: false, message: error.message };
  } finally {
    // 释放连接
    conn.release();
  }
}

最佳实践

  • 规范表设计: 合理的字段类型与长度
  • 合理的索引策略: 根据查询模式设计
  • 事务适度原则: 控制事务粒度与时长
  • 定期维护: 表分析、索引优化、碎片整理
  • 备份策略: 定期备份与验证恢复
  • 监控关键指标: 连接数、查询性能、缓冲命中率
  • 升级计划: 跟进版本安全更新

用知识点燃技术的火山