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

วิธีเพิ่มความเร็ว SELECT DISTINCT ใน MySQL ด้วย Index

การเพิ่มประสิทธิภาพ SELECT DISTINCT ด้วย Index

คำสั่ง SELECT DISTINCT ต้องสแกนข้อมูลทั้งหมดเพื่อหาค่าที่ไม่ซ้ำกัน การสร้าง Index บนคอลัมน์ที่ต้องการ DISTINCT จะช่วยให้ MySQL ใช้ Index Scan แทน Full Table Scan ได้

ตัวอย่าง: สร้าง Index ก่อน INSERT ข้อมูล

1. สร้างตาราง

CREATE TABLE DemoTable (
    Name VARCHAR(40)
);

2. สร้าง Index บนคอลัมน์ Name

CREATE INDEX Name_Index ON DemoTable (Name);

3. เพิ่มข้อมูล (มีค่าซ้ำ)

INSERT INTO DemoTable VALUES ('Chris'), ('Mike'), ('Chris'), ('Chris'), ('Sam');

4. ดูข้อมูลทั้งหมด

SELECT * FROM DemoTable;

ผลลัพธ์:

+-------+
| Name  |
+-------+
| Chris |
| Chris |
| Chris |
| Mike  |
| Sam   |
+-------+

5. SELECT DISTINCT (ใช้ Index)

SELECT DISTINCT Name FROM DemoTable;

ผลลัพธ์:

+-------+
| Name  |
+-------+
| Chris |
| Mike  |
| Sam   |
+-------+

เหตุผลที่ Index ช่วย SELECT DISTINCT

  • Index (B-Tree) จัดเก็บค่าคอลัมน์เรียงลำดับแล้ว
  • MySQL สามารถอ่าน Index แทน Table (Covering Index)
  • การหาค่า Distinct บนข้อมูลที่เรียงแล้ว เร็วมาก (แค่เปรียบเทียบค่าติดกัน)
  • ไม่ต้อง Sort เพิ่มเติม

ประเภท Index ที่เหมาะสม

Multi-column DISTINCT

-- สร้าง Composite Index
CREATE INDEX idx_name_age ON DemoTable (Name, Age);

-- Query
SELECT DISTINCT Name, Age FROM DemoTable;

Index จะช่วยได้หากลำดับคอลัมน์ใน Index ตรงกับ SELECT

ข้อจำกัด

  • Index ใช้พื้นที่ดิสก์และหน่วยความจำ
  • INSERT/UPDATE/DELETE จะช้าลงเล็กน้อย (ต้องอัปเดต Index)
  • คอลัมน์ที่มีความหลากหลายต่ำ (Low Cardinality) เช่น Gender (M/F) Index ไม่ช่วยมาก
  • คอลัมน์ TEXT/BLOB ต้องระบุ Prefix Length: INDEX idx_name (Name(20))

การตรวจสอบว่า Index ถูกใช้งาน

EXPLAIN SELECT DISTINCT Name FROM DemoTable;

ดูคอลัมน์ type = index หรือ ref และ Using index ใน Extra

Index Typeเหมาะสำหรับ
B-Tree (Default)DISTINCT, ORDER BY, Range Query, JOIN
HashEquality Lookup (=) เท่านั้น
FulltextFull-text Search
SpatialGeospatial Data