Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

MySQL: EXPLAIN ทำงานอย่างไร - รันคิวรี่หรือแค่อธิบายแผนการรัน?

ทำความเข้าใจ 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_keysindex ที่อาจใช้ได้
keyindex ที่ใช้จริง
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 = รันจริง + วัดผล