表关联查询

  • 先从驱动表查询出一批数据
  • 再用这批数据去关联表查询

核心就在于,两个表对应的查询条件都应该有对应的索引

成本计算

场景 数值 描述
查一页数据 1.0 io成本
筛选一条数据 0.2 cpu成本

一条sql里可能用的到的索引叫做possibleKeys

查询一个表有多少页

  1. 执行 show table status like 表名
  2. 获取data_length
  3. 计算 页 = data_length / 16kb
  4. 获取rows
  5. 总成本 = 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 走主键,针对被驱动表