การเพิ่มความเร็วในการ QUERY เดือนและปีในฐานข้อมูลชนิด DATETIME
การค้นหาข้อมูลจากปีและเดือนในข้อมูลชนิด DATETIME ถ้า Query ผิดวิธีจะทำให้ Query ข้อมูลไม่มีประสิทธิภาพ
ยกตัวอย่างการเลือกข้อมูล ในเดือนมีนาคม ปี คศ.2023 ปกติจะเขียน Query กันตามนี้
ปกติแล้วการเพิ่มความเร็วในการ Query สามารถทำได้โดยการทำ Index ให้กับข้อมูลที่จะ Query
แต่ปัญหาก็คือ การใช้คำสั้ง YEAR MONTH DAY DATE TIME กับคอลัมน์ชนิด DATETIME จะไม่สามารถใช้งาน Index ได้ จากรุปจะเห็นได้ว่าไม่สามารถใช้งาน Index กับ Query ลักษณะนี้ได้
วิธีที่จะทำให้สามารถใช้งาน Index กับข้อมูลชนิด DATETIME ได้คือการใช้คำสั่ง มากกว่า(>) น้อยกว่า(<) และเท่ากับ(=) กับข้อมูลชนิด DATETIME ยกตัวอย่างการเลือกข้อมูล ในเดือนมีนาคม ปี คศ.2023 จะเขียนได้ดังนี้
ลองตรวจสอบว่ามีการใช้ Index หรือยัง จากรูป จะเห็นว่ามีการกระทำกับจำนวนแถวลดลงอย่างมาก เนื่องจากมีการใช้ Index ในการ Query ข้อมูล
นอกจากนี้ยังสามารถใช้ BETWEEN แทน > < และ = ได้เช่นกัน (วิธีนี้จะมีประสิทธิภาพดีกว่าเล็กน้อย เนื่องจาก BETWEEN จะทำการเลือกข้อมูลที่เจาะจงมากกว่า แต่อาจจะทำให้ 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";