เป็นความคิดที่ดีที่จะทำดัชนีฟิลด์วันที่และเวลาใน mysql หรือไม่?


146

ฉันกำลังออกแบบฐานข้อมูลขนาดใหญ่ ในแอปพลิเคชันของฉันฉันจะมีหลายแถวเช่นปัจจุบันฉันมีหนึ่งตารางที่มีข้อมูล 4 ล้านรายการ คำค้นหาส่วนใหญ่ของฉันใช้ datetime clause เพื่อเลือกข้อมูล เป็นความคิดที่ดีที่จะทำดัชนีเขตข้อมูลวันที่เวลาในฐานข้อมูล mysql หรือไม่

Select field1, field2,.....,field15
from table where field 20 between now() and now + 30 days 

ฉันพยายามทำให้ฐานข้อมูลของฉันทำงานได้ดีและการสืบค้นจะทำงานได้อย่างราบรื่น

ยิ่งไปกว่านั้นคุณคิดว่าฉันควรจะต้องสร้างฐานข้อมูลที่มีประสิทธิภาพสูงอย่างไร


คืออะไรfield 20?
AlikElzin-kilaka

คำตอบ:


173

MySQL แนะนำให้ใช้ดัชนีด้วยเหตุผลหลายประการรวมถึงการกำจัดแถวระหว่างเงื่อนไข: http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html

สิ่งนี้ทำให้คอลัมน์วันที่และเวลาของคุณเป็นตัวเลือกที่ยอดเยี่ยมสำหรับดัชนีหากคุณจะใช้มันในเงื่อนไขบ่อยครั้งในการสืบค้น หากเงื่อนไขเดียวของคุณคือBETWEEN NOW() AND DATE_ADD(NOW(), INTERVAL 30 DAY)และคุณไม่มีดัชนีอื่นในเงื่อนไข MySQL จะต้องทำการสแกนแบบเต็มตารางในทุกแบบสอบถาม ฉันไม่แน่ใจว่ามีกี่แถวที่สร้างขึ้นใน 30 วัน แต่ตราบใดที่มีน้อยกว่าประมาณ 1/3 ของแถวทั้งหมดการใช้ดัชนีในคอลัมน์จะมีประสิทธิภาพมากกว่า

คำถามของคุณเกี่ยวกับการสร้างฐานข้อมูลที่มีประสิทธิภาพนั้นกว้างมาก ฉันจะบอกให้แน่ใจว่ามันเป็นมาตรฐานและคอลัมน์ที่เหมาะสมทั้งหมดได้รับการจัดทำดัชนีแล้ว (เช่นที่ใช้ในการรวมและที่ส่วนคำสั่ง)


3
ขอบคุณสำหรับคำอธิบาย ที่ช่วยได้จริงๆ ฉันแน่ใจว่าฉันจะมีตัวกรองมากขึ้น ฉันแค่ต้องการตรวจสอบให้แน่ใจว่าการจัดทำดัชนีฟิลด์วันที่และเวลาเป็นความคิดที่ดีหรือไม่เนื่องจากเราอาจมีเวลาวันที่ซ้ำกัน แต่คุณตอบอธิบายแล้ว :) ขอบคุณ
Jaylen

4
+1 สำหรับ "คนที่ใช้ในการรวมและที่ส่วนคำสั่ง" หลักการง่ายๆสำหรับกลยุทธ์การจัดทำดัชนี เห็นได้ชัดว่าตอนนี้ฉันคิดถึงมัน แต่ไม่เคยเกิดขึ้นกับฉันมาก่อน
Gaz_Edge

1
แต่ถ้าคุณค้นหาข้อมูลด้วยช่วงวันที่เช่นช่วงข้อมูลตั้งแต่ "2017-01-01 11:20" ถึง "2018-01-03 12:12" จะไม่ทำให้การSELECTสืบค้นเร็วขึ้นแม้ว่าฉันจะจัดทำดัชนีdate timeคอลัมน์แล้วก็ตาม .. ดัชนีทำให้การสืบค้นรวดเร็วเมื่อฉันใช้equalการดำเนินการ .. ฉันถูก?
user3595632

1
วิธีการเกี่ยวกับการสอบถามฟิลด์วันที่และเวลาด้วยฟังก์ชันเวลาเช่น DAY (วันที่และเวลา) หรือชั่วโมง (วันที่และเวลา) ดัชนีจะช่วยหรือขัดขวางในกรณีนี้หรือไม่?
cronoklee

สวัสดี @Explosion Pills ถ้าฉันต้องการเพียงแค่สอบถามตารางตามปีและเดือนฉันจะได้รับประสิทธิภาพที่ดีขึ้นหรือไม่ถ้าฉันสร้างคอลัมน์ใหม่ด้วยปีและเดือนเท่านั้นจากนั้นจัดทำดัชนีแทนที่จะสร้างดัชนีของคอลัมน์วันที่และเวลาโดยตรง เหรอ? เช่นฉันสร้างคอลัมน์ที่มีค่าเหมือน 201801
Woods Chen

18

ผู้เขียนทำการทดสอบที่นี่แสดงให้เห็นว่าการประทับเวลา unix จำนวนเต็มดีกว่า DateTime หมายเหตุเขาใช้ MySql แต่ฉันรู้สึกว่าไม่ว่าคุณจะใช้เครื่องมือ DB ใดในการเปรียบเทียบจำนวนเต็มจะเร็วกว่าการเปรียบเทียบวันที่เล็กน้อยดังนั้นดัชนี int จึงดีกว่าดัชนี DateTime ใช้ T1 - เวลาในการเปรียบเทียบ 2 วันที่ T2 - เวลาเปรียบเทียบจำนวนเต็ม 2 ตัว การค้นหาในฟิลด์ที่จัดทำดัชนีจะใช้เวลาประมาณ O (log (แถว)) เนื่องจากดัชนีขึ้นอยู่กับโครงสร้างที่สมดุล - อาจแตกต่างกันไปสำหรับเครื่องมือ DB ที่แตกต่างกัน แต่อย่างไรก็ตาม Log (แถว) เป็นการประมาณโดยทั่วไป (ถ้าคุณไม่ได้ใช้ bitmask หรือ r-tree index) ดังนั้นความแตกต่างคือ (T2-T1) * บันทึก (แถว) - อาจมีบทบาทหากคุณดำเนินการสืบค้นบ่อยๆ


ขอบคุณ. ฉันคิดว่ามันเป็นทางเลือกหนึ่ง แต่ไม่รู้ว่าจะเข้าหามันอย่างไร ฉันเชื่อว่าคุณเป็นจำนวนเต็มถูกต้องเร็วกว่าเสมอ
Jaylen

64
ดีกว่ามั้ย? ฉันสงสัยว่าการประทับเวลา Unix จะดีกว่าสำหรับทุกกรณี ใช่โดยทั่วไปการจัดเก็บจำนวนเต็มจะเร็วกว่าการจัดเก็บสตริง แต่ฟังก์ชัน DateTimeทั้งหมดที่MySQL จะเปิดเผยอย่างไร การนำไปใช้ด้วยตัวเองอาจส่งผลเสียต่อประสิทธิภาพหรือฟังก์ชันการทำงาน
Greg
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.