ฉันได้ตารางที่มีหลายคอลัมน์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ไม่ได้เป็นส่วนหนึ่งของดัชนีคลัสเตอร์