MySQL 数据排序

MySQL 的数据排序主要有两种方式:

  • 有索引:直接按照索引排序。
  • 无索引:采用文件排序。
    • 数据量少:内存排序,使用单路或双路排序(类似于用一只手或两只手抓数据)。
    • 数据量大:磁盘排序,通常采用归并排序。

SQL 语句的执行顺序

  1. 连接器校验权限。
  2. 分析器解析 SQL 语法,构建解析树。
  3. 优化器选择合适的索引和表连接顺序,生成多个执行计划,选择成本最低的执行。
  4. 执行器调用存储引擎查询数据并返回。

MySQL 的存储引擎

  • InnoDB:支持事务、行级锁、外键,默认存储引擎。
  • MyISAM:不支持事务,读取性能高,适合查询密集型业务。

MySQL 索引类型

  • 普通索引(辅助索引):提升查询效率,但不保证唯一性。
  • 主键索引(聚簇索引):数据存储在 B+ 树叶子节点,查询效率高。
  • 唯一索引:确保字段值唯一,查询速度快。
  • 联合索引:多个字段组合建立索引,遵循最左前缀匹配原则。
  • 全文索引:适用于长文本的模糊查询。
  • 空间索引:存储地理位置信息,如经纬度。

MySQL 事务

事务的实现

  1. :确保数据一致性,避免并发冲突。
  2. undo log:记录事务前的数据,回滚时使用。
  3. redo log:记录已提交事务的修改,崩溃后可恢复。
  4. MVCC(多版本并发控制):允许事务读取快照数据,提高并发性能。

事务的隔离级别

隔离级别 说明 可能问题
读未提交 可以读到未提交数据 脏读
读已提交 只能读到已提交数据 不可重复读
可重复读 事务中多次查询数据不变 幻读
串行化 事务串行执行 影响性能

二阶段提交(2PC)

  1. 准备阶段:协调者通知参与者执行事务,所有参与者先写入日志但不提交。
  2. 提交阶段:所有参与者都准备好后,协调者通知提交,否则回滚。

MySQL 常见优化

  • 使用索引:避免无索引字段排序,尽量使用覆盖索引。
  • 避免使用 LIKE %XXX%:会导致全表扫描。
  • EXPLAIN 分析执行计划:查看是否走索引、是否全表扫描。