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

การใช้คำสั่ง EXPLAIN ใน MySQL เพื่อดู Query Execution Plan

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/Accesssystem > const > eq_ref > ref > range > index > ALL
possible_keysIndex ที่อาจใช้ได้มีชื่อ Index แสดง
keyIndex ที่ใช้จริงไม่เป็น 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;  -- รันจริงและวัดเวลา