ทำความเข้าใจ EXPLAIN ใน MySQL: แค่ "อธิบาย" ไม่ได้ "รัน" คิวรี่จริง
EXPLAIN แสดงแผนการดำเนินการ (Execution Plan) ของคิวรี่ — ว่า MySQL จะดึงข้อมูลอย่างไร ใช้ index ไหน ประมาณจำนวนแถว — แต่ไม่ได้รันคิวรี่จริง (ยกเว้นบางกรณีของ subquery ที่ต้องประเมินก่อน)
สร้างตารางและข้อมูล
mysql> create table DemoTable1375 (
-> Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> FirstName varchar(20),
-> INDEX FIRST_INDEX(FirstName)
-> );
Query OK, 0 rows affected (0.73 sec)
mysql> insert into DemoTable1375(FirstName) values('Chris');
mysql> insert into DemoTable1375(FirstName) values('Bob');
mysql> insert into DemoTable1375(FirstName) values('Sam');
mysql> insert into DemoTable1375(FirstName) values('David');
คำสั่ง EXPLAIN
mysql> explain select * from DemoTable1375;
ผลลัพธ์ EXPLAIN
+----+-------------+---------------+------------+-------+---------------+-------------+---------+------+------+----------+-------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+---------------+------------+-------+---------------+-------------+---------+------+------+----------+-------------+ | 1 | SIMPLE | DemoTable1375 | NULL | index | NULL | FIRST_INDEX | 63 | NULL | 4 | 100.00 | Using index | +----+-------------+---------------+------------+-------+---------------+-------------+---------+------+------+----------+-------------+
คอลัมน์สำคัญใน EXPLAIN
| คอลัมน์ | ความหมาย |
|---|---|
id | ลำดับ SELECT (สำคัญเมื่อมี subquery/UNION) |
select_type | ประเภท: SIMPLE, PRIMARY, SUBQUERY, DERIVED, UNION, DEPENDENT SUBQUERY |
table | ตารางที่อ้างถึง |
type | ประเภทการเข้าถึง: system > const > eq_ref > ref > range > index > ALL (ดี→แย่) |
possible_keys | index ที่อาจใช้ได้ |
key | index ที่ใช้จริง |
key_len | ความยาว index ที่ใช้ (ไบต์) |
rows | ประมาณจำนวนแถวที่ต้องตรวจสอบ |
Extra | ข้อมูลเพิ่มเติม: Using index, Using where, Using temporary, Using filesort |
EXPLAIN ANALYZE (MySQL 8.0.18+)
นี่คือคำสั่งที่ "รันจริง" และวัดเวลา:
EXPLAIN ANALYZE SELECT * FROM DemoTable1375;
แสดงเวลาจริง (actual time), จำนวนแถวจริง (actual rows), loops รวมถึงแผนการ
EXPLAIN FORMAT=JSON
EXPLAIN FORMAT=JSON SELECT * FROM DemoTable1375;
ให้ข้อมูลละเอียดกว่า รวมถึง cost_info, query_block, nested loops
สรุป: EXPLAIN = แผนการ (ประมาณการ) | EXPLAIN ANALYZE = รันจริง + วัดผล