@ เปียโน 303 พูดแล้ว แต่ฉันจะพูดอีกครั้ง DOดัชนีการใช้งานในการรวมกันของคอลัมน์ ดัชนีแบบรวมบน(a, b)
นั้นจะช้ากว่าการสืบค้นa
แบบดัชนีa
เพียงอย่างเดียวเล็กน้อยและจะดีกว่ามากหากแบบสอบถามของคุณรวมทั้งสองคอลัมน์ ฐานข้อมูลบางอย่างสามารถเข้าร่วมดัชนีในa
และb
ก่อนที่จะกดปุ่มตาราง แต่ก็ไม่ดีเท่าที่มีดัชนีรวมกัน เมื่อคุณสร้างดัชนีแบบรวมคุณควรใส่คอลัมน์ที่มีแนวโน้มมากที่สุดที่จะค้นหาก่อนในดัชนีแบบรวม
ถ้าฐานข้อมูลของคุณสนับสนุนDOใส่ดัชนีในฟังก์ชั่นที่ปรากฏในคำสั่งมากกว่าคอลัมน์ (หากคุณกำลังเรียกใช้ฟังก์ชันบนคอลัมน์ดัชนีในคอลัมน์นั้นจะไร้ประโยชน์)
หากคุณกำลังใช้ฐานข้อมูลที่มีตารางชั่วคราวจริงที่คุณสามารถสร้างและทำลายในการบิน (เช่น PostgreSQL, MySQL, แต่ไม่ออราเคิล) แล้วไม่สร้างดัชนีในตารางชั่วคราว
หากคุณกำลังใช้ฐานข้อมูลที่ช่วยให้มัน (เช่นออราเคิล) ซึ่งเป็นDOล็อคในแผนของแบบสอบถามที่ดี การเพิ่มประสิทธิภาพข้อความค้นหาเมื่อเวลาผ่านไปจะเปลี่ยนแผนคิวรี พวกเขามักจะปรับปรุงแผน แต่บางครั้งพวกเขาก็ทำให้แย่ลงอย่างมาก โดยทั่วไปคุณจะไม่สังเกตเห็นการปรับปรุงแผนจริงๆ - แบบสอบถามไม่ใช่คอขวด แต่การวางแผนที่ไม่ดีเพียงครั้งเดียวอาจทำให้เว็บไซต์ยุ่ง
ไม่มีดัชนีในตารางที่คุณกำลังจะทำการโหลดข้อมูลขนาดใหญ่ มันเร็วกว่ามากในการดร็อปดัชนีโหลดข้อมูลจากนั้นสร้างดัชนีใหม่กว่าเพื่อรักษาไว้ในขณะที่คุณโหลดตาราง
ไม่ใช้ดัชนีกับข้อความค้นหาที่ต้องเข้าถึงมากกว่าเศษส่วนเล็ก ๆ ของตารางขนาดใหญ่ (ขนาดเล็กขึ้นอยู่กับฮาร์ดแวร์ 5% เป็นกฎง่ายๆ) ตัวอย่างเช่นถ้าคุณมีข้อมูลที่มีชื่อและเพศชื่อเป็นตัวเลือกที่ดีสำหรับการทำดัชนีเนื่องจากชื่อใดก็ตามที่แสดงถึงเศษเสี้ยวของแถวทั้งหมด มันจะไม่เป็นประโยชน์ในการจัดทำดัชนีเพศเนื่องจากคุณจะต้องเข้าถึง 50% ของแถว คุณต้องการใช้การสแกนแบบเต็มตารางแทน เหตุผลก็คือดัชนีปิดท้ายการเข้าถึงไฟล์ขนาดใหญ่แบบสุ่มทำให้คุณต้องค้นหาดิสก์ การค้นหาดิสก์ช้า ในกรณีที่ฉันเพิ่งจัดการเพื่อเร็วแบบสอบถามยาวชั่วโมงที่ดูเหมือน:
SELECT small_table.id, SUM(big_table.some_value)
FROM small_table
JOIN big_table
ON big_table.small_table_id = small_table.id
GROUP BY small_table.id
ต่ำกว่า 3 นาทีโดยเขียนใหม่ดังนี้:
SELECT small_table.id, big_table_summary.summed_value
FROM small_table
JOIN (
SELECT small_table_id, SUM(some_value) as summed_value
FROM big_table
GROUP BY small_table_id
) big_table_summary
ON big_table_summary.small_table_id = small_table.id
big_table.small_table_id
ซึ่งบังคับให้ฐานข้อมูลเพื่อให้เข้าใจว่ามันไม่ควรพยายามที่จะใช้ดัชนีที่ดึงดูดบน (ฐานข้อมูลที่ดีเช่น Oracle ควรเข้าใจด้วยตนเองแบบสอบถามนี้รันบน MySQL)
ปรับปรุง:นี่คือคำอธิบายของดิสก์แสวงหาจุดที่ฉันทำ ดัชนีให้การค้นหาอย่างรวดเร็วเพื่อบอกตำแหน่งของข้อมูลในตาราง นี่เป็นชัยชนะเพราะคุณจะดูเฉพาะข้อมูลที่คุณต้องการดู แต่ไม่เสมอไปโดยเฉพาะอย่างยิ่งหากคุณจะดูข้อมูลจำนวนมาก ดิสก์สตรีมข้อมูลได้ดี แต่ทำให้การค้นหาช้า การค้นหาข้อมูลแบบสุ่มบนดิสก์ใช้เวลา 1 / 200th ของวินาที ข้อความค้นหารุ่นที่ช้าทำสิ่งต่างๆเช่น 600,000 รายการและใช้เวลาเกือบหนึ่งชั่วโมง (มันทำการค้นหามากกว่านั้น แต่การแคชจับบางส่วน) ในทางตรงกันข้ามเวอร์ชันที่รวดเร็วรู้ว่ามันต้องอ่านทุกอย่างและสตรีมข้อมูลในระดับประมาณ 70 MB / วินาที มันผ่านตาราง 11 GB ภายในเวลาไม่ถึง 3 นาที