EXPLAIN: วิเคราะห์แผนการดำเนินการคำสั่ง SQL
EXPLAIN ใช้ตรวจสอบว่า MySQL จะดำเนินการ Query อย่างไร ใช้ Index หรือไม่ ทำ Full Table Scan หรือไม่ ช่วยให้ปรับปรุงประสิทธิภาพได้
คำสั่งที่รองรับ EXPLAIN
SELECT, INSERT, DELETE, REPLACE, UPDATE
สร้างตาราง Index และข้อมูล
mysql> CREATE TABLE DemoTable1488 (
-> StudentId INT,
-> StudentName VARCHAR(20),
-> StudentAge INT
-> );
Query OK, 0 rows affected (2.18 sec)
mysql> CREATE INDEX student_id_index ON DemoTable1488(StudentId);
Query OK, 0 rows affected (0.90 sec)
mysql> INSERT INTO DemoTable1488 VALUES
-> (101, 'Sam', 21), (102, 'Bob', 23), (103, 'David', 20);
Query OK, 3 rows affected
ใช้ EXPLAIN กับ Query ที่มี WHERE บนคอลัมน์ที่มี Index
mysql> EXPLAIN SELECT * FROM DemoTable1488 WHERE StudentId = 1;
ผลลัพธ์ EXPLAIN
+----+-------------+---------------+------------+------+------------------+------------------+---------+-------+------+----------+-------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+---------------+------------+------+------------------+------------------+---------+-------+------+----------+-------+ | 1 | SIMPLE | DemoTable1488 | NULL | ref | student_id_index | student_id_index | 5 | const | 1 | 100.00 | NULL | +----+-------------+---------------+------------+------+------------------+------------------+---------+-------+------+----------+-------+
คอลัมน์สำคัญใน EXPLAIN
| คอลัมน์ | ความหมาย | ค่าที่ดี |
|---|---|---|
| type | ประเภทการ Join/Access | system > const > eq_ref > ref > range > index > ALL |
| possible_keys | Index ที่อาจใช้ได้ | มีชื่อ Index แสดง |
| key | Index ที่ใช้จริง | ไม่เป็น NULL |
| key_len | ความยาว Index ที่ใช้ (Byte) | สอดคล้องกับชนิดข้อมูล |
| rows | ประมาณจำนวนแถวที่ต้องอ่าน | น้อยที่สุด |
| Extra | ข้อมูลเพิ่มเติม | Using index (Covering Index), Using where, Using temporary, Using filesort (หลีกเลี่ยง) |
การตีความตัวอย่างนี้
type: ref- ใช้ Index แบบ Non-unique Lookup (ดี)key: student_id_index- ใช้ Index ที่สร้างไว้จริงrows: 1- คาดว่าอ่านแค่ 1 แถว (แม่นยำ)Extra: NULL- ไม่มีการ Sort/Temp table เพิ่มเติม
EXPLAIN แบบละเอียดเพิ่มเติม (MySQL 8.0+)
EXPLAIN FORMAT=JSON SELECT * FROM DemoTable1488 WHERE StudentId = 1; EXPLAIN ANALYZE SELECT * FROM DemoTable1488 WHERE StudentId = 1; -- รันจริงและวัดเวลา