MySQL学习笔记:单表访问方法
1 单表访问方法
1.1 const
const:通过主键或唯一二级索引查询记录的访问方法。
- 唯一二级索引包含多个列时,查询条件需包含所有列。
- 查询条件为某一列为NULL时,不能使用const。
1.2 ref、ref_or_null
ref:搜索条件为二级索引列常数等值比较,形成单点扫描区间的查询方法。
- 查询条件为某一列为NULL时,可以使用ref。
- 二级索引包含多个列时,查询条件是最左边的列与常数比较时就可以使用。
ref_or_null:比ref多了NULL的查询。
1.3 range
range:形成多个单点扫描区间或范围区间的查询方法。
1.4 index
index:查询列表中所有列被二级索引包含,查询条件也在二级索引中,不需要回表。
1.2 索引合并
1.2.1 intersection索引合并
同时使用两个索引查询,找出主键相同的记录执行回表操作。
- 索引记录需要按照主键排序,便于提取交集、降低磁盘I/O。
1.2.2 union索引合并
同时使用两个索引查询,找出主键并集的记录执行回表操作。
- 索引记录需要按照主键排序,便于提取并集、降低磁盘I/O。
1.2.3 sort-union索引合并
同时使用两个索引查询,找出主键并集的记录,根据主键排序后执行回表操作。
2 连接
- 内连接:驱动表中的记录在被驱动表中找不到匹配记录时不加入结果。
- 外连接:驱动表中的记录在被驱动表中找不到匹配记录时加入结果。左侧表为驱动表时为左外连接,右侧表为驱动表时为右外连接。
- 驱动表、被驱动表:驱动表是第一个被查询的表,从驱动表中筛选符合条件的记录到被驱动表查询。
连接查询的方法:
- 嵌套循环连接:被驱动表查询过程中可全表扫描或使用索引。
- 基于块的嵌套循环连接:使用Joinbuffer缓存驱动表记录,减少被驱动表查询时产生的I/O。
3 成本分析
3.1 单表查询成本分析
查询的成本由I/O成本、CPU成本构成。I/O成本是从磁盘加载页到内存的时间。CPU成本是筛选、排序记录等操作的成本。这两项分别对应成本常数。
c
o
s
t
a
l
l
=
c
o
s
t
c
p
u
+
c
o
s
t
m
e
m
cost_{all} = cost_{cpu} + cost_{mem}
costall=costcpu+costmem
c
o
s
t
c
p
u
=
N
r
e
c
∗
f
c
p
u
+
b
i
a
s
c
p
u
cost_{cpu} =N_{rec} * f_{cpu} + bias_{cpu}
costcpu=Nrec∗fcpu+biascpu
c
o
s
t
m
e
m
=
N
p
a
g
e
∗
f
m
e
m
+
b
i
a
s
m
e
m
cost_{mem} =N_{page} * f_{mem} + bias_{mem}
costmem=Npage∗fmem+biasmem
其中记录数量、页面数量可由表的统计信息得到。
3.2 连接查询成本
c o s t j o i n = c o s t d r i v e + f a n o u t ∗ c o s t d r i v e n cost_{join} = cost_{drive}+fanout*cost_{driven} costjoin=costdrive+fanout∗costdriven