การเพิ่มประสิทธิภาพ 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 ที่เหมาะสม
| Index Type | เหมาะสำหรับ |
|---|---|
| B-Tree (Default) | DISTINCT, ORDER BY, Range Query, JOIN |
| Hash | Equality Lookup (=) เท่านั้น |
| Fulltext | Full-text Search |
| Spatial | Geospatial Data |