GORAGOD.com

การเพิ่มความเร็วในการ QUERY เดือนและปีในฐานข้อมูลชนิด DATETIME

การค้นหาข้อมูลจากปีและเดือนในข้อมูลชนิด DATETIME ถ้า Query ผิดวิธีจะทำให้ Query ข้อมูลไม่มีประสิทธิภาพ

ยกตัวอย่างการเลือกข้อมูล ในเดือนมีนาคม ปี คศ.2023 ปกติจะเขียน Query กันตามนี้
SELECT `time` FROM `logs` WHERE YEAR(`time`)=2023 AND MONTH(`time`)=3;

ปกติแล้วการเพิ่มความเร็วในการ Query สามารถทำได้โดยการทำ Index ให้กับข้อมูลที่จะ Query
ALTER TABLE `logs` ADD INDEX (`time`);

แต่ปัญหาก็คือ การใช้คำสั้ง YEAR MONTH DAY DATE TIME กับคอลัมน์ชนิด DATETIME จะไม่สามารถใช้งาน Index ได้ จากรุปจะเห็นได้ว่าไม่สามารถใช้งาน Index กับ Query ลักษณะนี้ได้

วิธีที่จะทำให้สามารถใช้งาน Index กับข้อมูลชนิด DATETIME ได้คือการใช้คำสั่ง มากกว่า(>) น้อยกว่า(<) และเท่ากับ(=) กับข้อมูลชนิด DATETIME ยกตัวอย่างการเลือกข้อมูล ในเดือนมีนาคม ปี คศ.2023 จะเขียนได้ดังนี้
SELECT `time` FROM `logs` WHERE `time`>="2023-03-01 00:00:00" AND `time`<"2023-04-01 00:00:00";

ลองตรวจสอบว่ามีการใช้ Index หรือยัง จากรูป จะเห็นว่ามีการกระทำกับจำนวนแถวลดลงอย่างมาก เนื่องจากมีการใช้ Index ในการ Query ข้อมูล

นอกจากนี้ยังสามารถใช้ BETWEEN แทน > < และ = ได้เช่นกัน (วิธีนี้จะมีประสิทธิภาพดีกว่าเล็กน้อย เนื่องจาก BETWEEN จะทำการเลือกข้อมูลที่เจาะจงมากกว่า แต่อาจจะทำให้ QUERY ดูเข้าใจยากนิดนึง)
SELECT `time` FROM `logs` WHERE `time` BETWEEN "2023-03-01 00:00:00" AND "2023-03-31 23:59:59";