MySQL EXPLAIN 妙用:执行计划分析与优化技巧

MySQL EXPLAIN 妙用:执行计划分析与优化技巧 在 MySQL 开发中,遇到 SQL 执行缓慢时,最常用的分析工具之一就是 EXPLAIN。 它可以帮助我们回答几个关键问题: MySQL 使用了哪个索引? SQL 是全表扫描还是索引扫描? 预计扫描多少行? 多表 JOIN 的执行顺序是什么? 是否发生了额外排序或临时表? 优化器的估算是否准确? MySQL 8.x 还提供了 EXPLAIN ANALYZE,可以进一步查看实际执行情况。 官方文档:MySQL EXPLAIN 官方文档 一、EXPLAIN 基本用法 最简单的使用方式: EXPLAIN SELECT * FROM users WHERE id = 10001; 也可以分析复杂 SQL: EXPLAIN SELECT o.id, o.amount, u.name FROM orders o JOIN users u ON u.id = o.user_id WHERE o.status = 1 ORDER BY o.created_at DESC LIMIT 20; 常见输出: +----+-------------+-------+------+---------------+---------+---------+-------+------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+------+---------------+---------+---------+-------+------+-------------+ | 1 | SIMPLE | users | const| PRIMARY | PRIMARY | 8 | const | 1 | | +----+-------------+-------+------+---------------+---------+---------+-------+------+-------------+ 实际分析时,不需要一开始记住所有字段,重点关注以下列:...

2023年09月01日 · 4 min · Leanku

MySQL JOIN 原理与优化

MySQL JOIN 原理与优化 JOIN 是关系型数据库中最常见的操作之一。用户、订单、商品、文章、评论等业务数据通常分散在不同表中,查询时再通过关联关系组合起来。 例如: SELECT o.id, o.order_no, u.username FROM orders o JOIN users u ON u.id = o.user_id WHERE o.status = 1; 这条 SQL 看起来很简单,但 MySQL 实际需要解决几个问题: 使用哪张表作为驱动表? ↓ 如何找到另一张表对应的数据? ↓ 是否能够使用索引? ↓ 需要扫描多少行? ↓ 最终执行成本是多少? 因此,JOIN 优化并不是简单地“少 JOIN 几张表”,真正重要的是理解 JOIN 的执行方式、数据访问路径以及索引设计。 1. JOIN 的基本原理 假设有两张表: users +----+----------+ | id | username | +----+----------+ | 1 | Alice | | 2 | Bob | | 3 | Tom | +----+----------+ orders +----+---------+---------+ | id | user_id | amount | +----+---------+---------+ | 1 | 1 | 100....

2023年08月04日 · 6 min · Leanku