MySQL 单表访问方法详解

MySQL 单表访问方法详解:高效查询之道

核心思想: MySQL 执行单表查询的目标是尽可能高效地从表中获取所需数据。访问方法(Access Method)决定了 MySQL 如何扫描表中的记录,是全表扫描还是利用索引,直接影响查询性能。理解并选择合适的访问方法是查询优化的基础。

一、 查询执行基础

  • 查询优化器****与执行计划: MySQL Server 中的查询优化器解析查询语句后生成执行计划。执行计划决定了使用哪些索引、表的连接顺序等。存储引擎根据执行计划执行查询并返回结果。理解查询执行原理是优化慢查询的关键。

  • 单表查询: 本文聚焦于单表查询(FROM 子句后只有一个表),这是最基础的查询类型。

二、 访问方法 (Access Method) 概念

访问方法是指 MySQL 访问表数据的方式,决定了查询优化器选择哪种策略检索数据。

  • 全表扫描 (ALL): 逐行扫描所有记录。适用于无索引或查询条件无法利用索引的情况,效率低,尤其对于大表。

  • 索引访问: 利用索引快速定位数据。包括针对主键/唯一索引的等值查询、普通二级索引的等值查询、索引列的范围查询以及索引全扫描等。

三、 具体访问方法 (从最优到最差)

以下访问方法按效率从高到低排序,类似于查询优化器选择路径的优先级:

  1. const (或 system):常数级别访问
  • 原理: 使用主键 (PRIMARY KEY) 或唯一二级索引 (UNIQUE INDEX) 与常数进行等值匹配,且最多返回一条记录。systemconst 的特例,表只有一行记录时使用。

  • 机制: B+ 树索引快速查找,直接定位。由于索引的有序性,查找接近 O(1)。查询优化器预先计算索引查找路径。

  • 应用场景: 根据用户 ID (主键) 查用户信息;根据唯一订单号 (唯一索引) 查订单。

  • 性能: 极速,少量 I/O。

  • 示例:


SELECT * FROM users WHERE id = 1; -- id 是主键

SELECT * FROM orders WHERE order_no = 'unique_123'; -- order_no 是唯一索引

限制 :仅适用于主键列或唯一二级索引列与常数的等值比较,且当唯一二级索引列值为 NULL 时不可用此方法。

  1. eq_ref:唯一索引等值引用 (连接查询)
  • 原理: 连接查询中,被驱动表通过主键或唯一二级索引等值匹配访问,且保证对于驱动表的每条记录,被驱动表最多只返回一条匹配记录。

  • 机制: 索引关联,驱动表结果驱动被驱动表查询。被驱动表通过唯一索引快速查找。

  • 应用场景: 订单表和用户表关联,通过用户 ID (用户表主键) 关联订单表;一对一关联。

  • 性能: 高效,少量 I/O。

  • 示例:


SELECT o.*, u
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我爱松子鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值