ฉันได้ตารางที่มีหลายคอลัมน์UNIQUE
ดัชนีในและ_job_id__
__keyword_id__
ฉันจะต้องเพิ่มดัชนีอื่นหรือไม่__job_id__
หากฉันมีแบบสอบถามบ่อยซึ่งดำเนินการGROUP BY
ในคอลัมน์นั้น
(ที่ 100 ล้านแถวอาจใช้เวลาสักครู่นี่คือเหตุผลที่ฉันถามแทนที่จะทำ)
ฉันได้ตารางที่มีหลายคอลัมน์UNIQUE
ดัชนีในและ_job_id__
__keyword_id__
ฉันจะต้องเพิ่มดัชนีอื่นหรือไม่__job_id__
หากฉันมีแบบสอบถามบ่อยซึ่งดำเนินการGROUP BY
ในคอลัมน์นั้น
(ที่ 100 ล้านแถวอาจใช้เวลาสักครู่นี่คือเหตุผลที่ฉันถามแทนที่จะทำ)
คำตอบ:
ไม่เลย !!! เครื่องมือเพิ่มประสิทธิภาพการสืบค้นข้อมูลของ MySQL จะทำสิ่งที่ถูกต้องหากคอลัมน์หลักที่ต้องการอยู่ด้านซ้ายสุดในดัชนี หากคุณทำดัชนีเช่นนี้เครื่องมือเพิ่มประสิทธิภาพการสืบค้น MySQL อาจเลือกที่จะไม่ใช้ดัชนีนั้นหากคุณใช้ GROUP BY job_id, keyword_id เครื่องมือเพิ่มประสิทธิภาพการสืบค้น MySQL อาจใช้ดัชนีหรือไม่ก็ได้หากคุณรวบรวมบันทึกด้วย job_id เท่านั้น แต่คุณมีดัชนีซ้ำซ้อนที่สิ้นเปลืองพื้นที่อยู่แล้ว
หากตารางคือ MyISAM การสร้างดัชนีจะทำให้ไฟล์ MYI ขยายตัว
หากตารางคือ InnoDB และ innodb_file_per_table เป็น 0 การสร้างดัชนีดังกล่าวก็จะขยายตัว ibdata1
หากตารางคือ InnoDB และ innodb_file_per_table คือ 1 การสร้างดัชนีดังกล่าวจะทำให้ไฟล์. ibd ของตารางขยายตัวออกไป
โดยสรุปคุณไม่จำเป็นต้องสร้างดัชนีเพิ่มเติม !!!
ดัชนีสามารถเพิ่มความเร็วในgroup by
การดำเนินการได้โดยลดการเรียงลำดับซึ่งจะมีประสิทธิภาพมากขึ้นถ้าดัชนีที่ใช้เป็นดัชนีคลัสเตอร์หรืออย่างน้อยมีคอลัมน์นำหน้าเหมือนกับดัชนีคลัสเตอร์ ในทั้งหมดนี้ฉันสมมติว่า MySQL ไม่มีการhash group by
ดำเนินการเทียบเท่าซึ่งโดยปกติแล้วจะข้ามผลประโยชน์ของดัชนีใด ๆ - บางทีคนอื่นสามารถยืนยันสิ่งนี้
มีข้อดีเล็กน้อยที่จะมีดัชนีแยกต่างหากjob_id
โดยสมมติว่าเป็นคอลัมน์เดียวในส่วนgroup by
คำสั่งและไม่เป็นดัชนีกลุ่ม: ดัชนีจะมีขนาดเล็กลงดังนั้นการสแกนจะสร้าง I / O น้อยลง
--EDIT--
เนื่องจากดัชนีมีฟิลด์คีย์หลักทั้งหมดที่กำหนดไว้สำหรับคีย์ดัชนีคลัสเตอร์ที่ไม่ได้อยู่ในดัชนีรองดัชนีบนjob_id
จะมีขนาดเล็กกว่าดัชนีในjob_id, keyword_id
หากkeyword_id
ไม่ได้เป็นส่วนหนึ่งของดัชนีคลัสเตอร์