表关联查询
- 先从驱动表查询出一批数据
- 再用这批数据去关联表查询
核心就在于,两个表对应的查询条件都应该有对应的索引
成本计算
| 场景 | 数值 | 描述 |
|---|---|---|
| 查一页数据 | 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 | 走主键,针对被驱动表 |