单表访问
MySQL 单表访问方法详解:高效查询之道
核心思想: MySQL 执行单表查询的目标是尽可能高效地从表中获取所需数据。访问方法(Access Method)决定了 MySQL 如何扫描表中的记录,是全表扫描还是利用索引,直接影响查询性能。理解并选择合适的访问方法是查询优化的基础。
一、 查询执行基础
-
查询优化器****与执行计划: MySQL Server 中的查询优化器解析查询语句后生成执行计划。执行计划决定了使用哪些索引、表的连接顺序等。存储引擎根据执行计划执行查询并返回结果。理解查询执行原理是优化慢查询的关键。
-
单表查询: 本文聚焦于单表查询(FROM 子句后只有一个表),这是最基础的查询类型。
二、 访问方法 (Access Method) 概念
访问方法是指 MySQL 访问表数据的方式,决定了查询优化器选择哪种策略检索数据。
-
全表扫描 (ALL): 逐行扫描所有记录。适用于无索引或查询条件无法利用索引的情况,效率低,尤其对于大表。
-
索引访问: 利用索引快速定位数据。包括针对主键/唯一索引的等值查询、普通二级索引的等值查询、索引列的范围查询以及索引全扫描等。
三、 具体访问方法 (从最优到最差)
以下访问方法按效率从高到低排序,类似于查询优化器选择路径的优先级:
const(或system):常数级别访问
-
原理: 使用主键 (PRIMARY KEY) 或唯一二级索引 (UNIQUE INDEX) 与常数进行等值匹配,且最多返回一条记录。
system是const的特例,表只有一行记录时使用。 -
机制: B+ 树索引快速查找,直接定位。由于索引的有序性,查找接近 O(1)。查询优化器预先计算索引查找路径。
-
应用场景: 根据用户 ID (主键) 查用户信息;根据唯一订单号 (唯一索引) 查订单。
-
性能: 极速,少量 I/O。
-
示例:
SELECT * FROM users WHERE id = 1; -- id 是主键
SELECT * FROM orders WHERE order_no = 'unique_123'; -- order_no 是唯一索引
限制 :仅适用于主键列或唯一二级索引列与常数的等值比较,且当唯一二级索引列值为 NULL 时不可用此方法。
eq_ref:唯一索引等值引用 (连接查询)
-
原理: 连接查询中,被驱动表通过主键或唯一二级索引等值匹配访问,且保证对于驱动表的每条记录,被驱动表最多只返回一条匹配记录。
-
机制: 索引关联,驱动表结果驱动被驱动表查询。被驱动表通过唯一索引快速查找。
-
应用场景: 订单表和用户表关联,通过用户 ID (用户表主键) 关联订单表;一对一关联。
-
性能: 高效,少量 I/O。
-
示例:
SELECT o.*, u

1310

被折叠的 条评论
为什么被折叠?



