คุณควรใช้เวลาในการอ่านการจัดทำดัชนีมีหลายสิ่งที่เขียนเกี่ยวกับมันและสิ่งสำคัญคือต้องเข้าใจว่าเกิดอะไรขึ้น
การพูดแบบกว้าง ๆ ดัชนีจะกำหนดลำดับของแถวของตาราง
เพื่อความเรียบง่ายลองจินตนาการว่าตารางเป็นเพียงไฟล์ CSV ขนาดใหญ่ เมื่อใดก็ตามที่มีแทรกแถวก็แทรกในตอนท้าย ดังนั้นการเรียงลำดับแบบ "ธรรมชาติ" ของตารางจึงเป็นเพียงลำดับในการแทรกแถว
ลองจินตนาการว่าคุณมีไฟล์ CSV ที่โหลดในแอปพลิเคชันสเปรดชีตที่เป็นพื้นฐาน สเปรดชีตทั้งหมดนี้แสดงข้อมูลและกำหนดจำนวนแถวตามลำดับ
ทีนี้ลองนึกภาพว่าคุณต้องหาแถวทั้งหมดที่มีค่า "M" ในคอลัมน์ที่สาม เมื่อพิจารณาจากสิ่งที่คุณมีอยู่คุณมีเพียงหนึ่งตัวเลือก คุณสแกนตารางตรวจสอบค่าของคอลัมน์ที่สามสำหรับแต่ละแถว หากคุณมีจำนวนมากแถววิธีนี้ ("สแกนตาราง") อาจใช้เวลานาน!
ลองจินตนาการว่านอกเหนือจากตารางนี้แล้วคุณยังมีดัชนี ดัชนีเฉพาะนี้คือดัชนีของค่าในคอลัมน์ที่สาม ดัชนีแสดงรายการค่าทั้งหมดจากคอลัมน์ที่สามตามลำดับที่มีความหมาย (พูดตามลำดับตัวอักษร) และสำหรับแต่ละค่าให้รายการของหมายเลขแถวที่ค่านั้นปรากฏขึ้น
ตอนนี้คุณมีกลยุทธ์ที่ดีสำหรับการค้นหาแถวทั้งหมดที่ค่าของคอลัมน์ที่สามคือ "M" ตัวอย่างเช่นคุณสามารถทำการค้นหาแบบไบนารี ! ในขณะที่การสแกนตารางต้องการให้คุณมองแถว N (โดยที่ N คือจำนวนแถว) การค้นหาแบบไบนารีจะกำหนดให้คุณดูรายการดัชนี log-n เท่านั้นในกรณีที่แย่ที่สุด ว้าวแน่นอนว่าง่ายกว่าเยอะ!
แน่นอนถ้าคุณมีดัชนีนี้และคุณกำลังเพิ่มแถวลงในตาราง (ท้ายที่สุดเนื่องจากเป็นวิธีที่ตารางแนวคิดของเราทำงาน) คุณต้องอัปเดตดัชนีทุกครั้ง ดังนั้นคุณจะทำงานเพิ่มอีกเล็กน้อยในขณะที่คุณกำลังเขียนแถวใหม่ แต่คุณประหยัดเวลาได้มากเมื่อคุณค้นหาบางอย่าง
ดังนั้นโดยทั่วไปการสร้างดัชนีจะสร้างข้อเสียระหว่างประสิทธิภาพการอ่านและประสิทธิภาพการเขียน หากไม่มีดัชนีเม็ดมีดสามารถแทรกได้อย่างรวดเร็ว - เอ็นจิ้นฐานข้อมูลเพิ่งเพิ่มแถวลงในตาราง เมื่อคุณเพิ่มดัชนีเอ็นจิ้นจะต้องอัพเดตแต่ละดัชนีขณะทำการแทรก
ในทางกลับกันการอ่านจะเร็วขึ้นมาก
หวังว่าจะครอบคลุมคำถามสองข้อแรกของคุณ (อย่างที่คนอื่นตอบแล้วคุณต้องหายอดที่เหมาะสม)
สถานการณ์ที่สามของคุณซับซ้อนกว่าเล็กน้อย หากคุณใช้ LIKE เครื่องมือสร้างดัชนีจะช่วยให้คุณอ่านได้เร็วขึ้นถึง "%" ตัวแรก กล่าวอีกนัยหนึ่งหากคุณกำลังเลือกคอลัมน์ที่ต้องการ 'foo% bar%' ฐานข้อมูลจะใช้ดัชนีเพื่อค้นหาแถวทั้งหมดที่คอลัมน์เริ่มต้นด้วย "foo" แล้วต้องสแกน rowset ระดับกลางนั้นเพื่อค้นหาชุดย่อย ที่มี "บาร์" เลือก ... คอลัมน์ที่ต้องการ '% bar%' ไม่สามารถใช้ดัชนีได้ ฉันหวังว่าคุณจะเห็นเหตุผล
สุดท้ายคุณต้องเริ่มคิดเกี่ยวกับดัชนีในคอลัมน์มากกว่าหนึ่งคอลัมน์ แนวคิดนั้นเหมือนกันและมีพฤติกรรมคล้ายกับสิ่งของ LIKE - โดยพื้นฐานแล้วหากคุณมีดัชนีใน (a, b, c) เครื่องยนต์จะใช้ดัชนีจากซ้ายไปขวาอย่างต่อเนื่องเท่าที่จะทำได้ ดังนั้นการค้นหาในคอลัมน์ a อาจใช้ดัชนี (a, b, c) เช่นเดียวกับใน (a, b) อย่างไรก็ตามเอ็นจิ้นจะต้องทำการสแกนแบบเต็มตารางหากคุณค้นหา WHERE b = 5 AND c = 1)
หวังว่านี่จะช่วยลดแสงได้เล็กน้อย แต่ฉันต้องย้ำว่าคุณควรใช้เวลาสักสองสามชั่วโมงขุดหาบทความดีๆที่อธิบายสิ่งเหล่านี้ในเชิงลึก คุณควรอ่านเอกสารของเซิร์ฟเวอร์ฐานข้อมูลเฉพาะของคุณด้วย วิธีดำเนินการดัชนีและใช้โดยตัววางแผนคิวรีอาจแตกต่างกันอย่างกว้างขวาง