表关联查询
- 先从驱动表查询出一批数据
- 再用这批数据去关联表查询
核心就在于,两个表对应的查询条件都应该有对应的索引
成本计算
场景 | 数值 | 描述 |
---|---|---|
查一页数据 | 1.0 | io成本 |
筛选一条数据 | 0.2 | cpu成本 |
一条sql里可能用的到的索引叫做possibleKeys
查询一个表有多少页
- 执行
show table status like 表名
- 获取data_length
- 计算 页 = data_length / 16kb
- 获取rows
- 总成本 = io成本+cpu成本 = 页数 * 1.0 + rows * 0.2
子查询场景
- 先执行子查询语句,生成物化表
- 遍历物化表,到主表查索引
explain表
column | describe |
---|---|
id | |
select_type | |
table | |
type | |
possible_keys | |
key | |
key_len | |
ref | |
rows | 会扫描这个表的多少记录 |
Extra | 用什么方式来匹配记录。nestedLoop表示会用上一张表的每一条结果,来循环查询当前表的每条记录 |
selectType类型 | 解释 |
---|---|
simple | 普通的单表或多表查询 |
primary | 存在多个独立查询时,主查询语句 |
subQuery | |
union | union查询的第二个查询 |
union_result | union查询的整合步骤 |
dependent | 标记多个子查询 |
derived | 生成物化表 |
type类型 | 解释 |
---|---|
const | 走唯一索引 |
ref | 走非唯一二级索引 |
range | 走索引进行范围查询 |
ref_or_null | 走非唯一索引,且 is null |
index | 只需要遍历二级索引,不需要回表的操作 |
all | 全表扫描 |
eq_ref | 走主键,针对被驱动表 |