数据库查缺补漏

Mysql的EXPLAIN应该重点关注哪些字段?

  1. type.访问类型
    1.1. const.通过主键索引/唯一非空索引。整张查询只匹配一行常量数据,单表查询为主
    1.2. eq_ref.通过主键索引/唯一非空索引。多表关联join时,驱动表每一行,精确匹配被连接表的唯一一行
    1.3. ref.普通索引等值匹配,匹配多行
    1.4. range.索引范围查询(between/>/</in)
    1.5. index.全索引扫描
    1.6. ALL.全表扫描,最差,必须避免
  2. possible_keys.候选索引,不一定真的用上
  3. key_len.使用索引字段占用字节长度,可判断是否用到联合索引全部字段
  4. rows.预计需要扫描的行数
  5. Extra(额外关键信息,重点关注)
    5.1. Using index。覆盖索引
    5.2. Using index condition。索引条件下推
    5.3. Using where。服务器层在获取数据后,额外做 WHERE 条件过滤
    5.4. Using join buffer。没有合适索引做表连接,MySQL 使用连接缓冲区(内存)来匹配关联行
    5.5. Using filesort。创建临时表(内存 / 磁盘临时表)来处理 GROUP BY / DISTINCT / UNION / 子查询等操作,开销很大
    5.6. Using temporary。创建临时表(内存 / 磁盘临时表)来处理 GROUP BY / DISTINCT / UNION / 子查询等操作,开销很大

UNION和UNION ALL的区别?

对比项UNIONUNION ALL
去重逻辑自动去除重复行保留全部原始数据,不去重
排序行为合并后做排序直接按原始顺序拼接,不额外排序
底层开销高(会产生临时表、额外排序运算)开销很小,无额外去重/排序操作
性能较慢速度更快,日常优先使用
使用场景需要整体去重的场景确认无重复数据、追求查询性能