การจัดทำดัชนีฐานข้อมูลทำงานอย่างไร [ปิด]


2419

เนื่องจากการจัดทำดัชนีมีความสำคัญมากเมื่อชุดข้อมูลของคุณมีขนาดเพิ่มขึ้นมีใครสามารถอธิบายได้ว่าการจัดทำดัชนีทำงานอย่างไรในระดับฐานข้อมูลผู้ไม่เชื่อเรื่องพระเจ้า?

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

คำตอบ:


3546

ทำไมถึงจำเป็น?

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

เนื่องจากความจริงที่ว่าจำนวนเรคคอร์ดสามารถจัดเรียงในฟิลด์เดียวเท่านั้นเราสามารถระบุว่าการค้นหาในฟิลด์ที่ไม่ได้จัดเรียงต้องใช้การค้นหาแบบเชิงเส้นซึ่งต้องใช้การN/2เข้าถึงแบบบล็อก (โดยเฉลี่ย) ซึ่งNเป็นจำนวนบล็อกที่ ตารางครอบคลุม หากฟิลด์นั้นเป็นฟิลด์ที่ไม่ใช่คีย์ (เช่นไม่มีรายการที่ไม่ซ้ำ) ดังนั้นพื้นที่ตารางทั้งหมดจะต้องค้นหาที่การNเข้าถึงบล็อก

อาจใช้การค้นหาแบบไบนารีซึ่งมีการlog2 Nเข้าถึงแบบบล็อก นอกจากนี้เนื่องจากข้อมูลจะถูกจัดเรียงตามเขตข้อมูลที่ไม่ใช่คีย์ส่วนที่เหลือของตารางไม่จำเป็นต้องค้นหาค่าที่ซ้ำกันเมื่อพบค่าที่สูงขึ้น ดังนั้นการเพิ่มประสิทธิภาพจึงเป็นสิ่งสำคัญ

การจัดทำดัชนีคืออะไร?

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

ข้อเสียของการจัดทำดัชนีคือดัชนีเหล่านี้ต้องการพื้นที่เพิ่มเติมบนดิสก์เนื่องจากดัชนีจะถูกจัดเก็บไว้ในตารางโดยใช้กลไก MyISAM ไฟล์นี้สามารถเข้าถึงขนาด จำกัด ของระบบไฟล์พื้นฐานได้อย่างรวดเร็วหากฟิลด์จำนวนมากในตารางเดียวกันถูกทำดัชนี .

มันทำงานยังไง?

ก่อนอื่นเรามาร่างเค้าร่างตารางฐานข้อมูลตัวอย่าง

ชื่อเขตข้อมูลชนิดข้อมูลขนาดบนดิสก์
id (คีย์หลัก) INT 4 ไบต์ที่ไม่ได้ลงนาม
firstName Char (50) 50 ไบต์
นามสกุลชื่อ Char (50) 50 ไบต์
emailAddress Char (100) 100 ไบต์

หมายเหตุ : char ถูกใช้แทน varchar เพื่ออนุญาตขนาดที่ถูกต้องกับค่าดิสก์ ฐานข้อมูลตัวอย่างนี้มีห้าล้านแถวและไม่ได้ทำดัชนี ตอนนี้ประสิทธิภาพของแบบสอบถามหลายรายการจะได้รับการวิเคราะห์ เหล่านี้เป็นแบบสอบถามโดยใช้ID (เรียงคีย์ฟิลด์) และใช้firstName (ที่ไม่ใช่คีย์ข้อมูลไม่ได้เรียงลำดับ)

ตัวอย่างที่ 1 -เรียงลำดับฟิลด์ที่ไม่เรียงลำดับแล้ว

ให้ฐานข้อมูลตัวอย่างของเราr = 5,000,000บันทึกของขนาดคงที่ให้ความยาวบันทึกR = 204ไบต์และพวกเขาจะถูกเก็บไว้ในตารางโดยใช้เครื่องยนต์ MyISAM ซึ่งใช้B = 1,024ไบต์ขนาดบล็อกเริ่มต้น ปัจจัยการปิดกั้นของตารางจะbfr = (B/R) = 1024/204 = 5บันทึกต่อดิสก์บล็อก จำนวนรวมของบล็อกที่ต้องใช้เพื่อเก็บตารางคือN = (r/bfr) = 5000000/5 = 1,000,000บล็อก

การค้นหาเชิงเส้นในฟิลด์ id จะต้องใช้ค่าเฉลี่ยของการN/2 = 500,000เข้าถึงบล็อกเพื่อค้นหาค่าเนื่องจากฟิลด์ id เป็นฟิลด์สำคัญ แต่เนื่องจากมีการเรียงลำดับฟิลด์ id ด้วยจึงสามารถทำการค้นหาแบบไบนารีที่ต้องการการlog2 1000000 = 19.93 = 20เข้าถึงบล็อกโดยเฉลี่ย ทันทีที่เราเห็นว่านี่เป็นการปรับปรุงที่รุนแรง

ตอนนี้เขตข้อมูลFirstNameไม่ได้ถูกจัดเรียงหรือไม่มีเขตข้อมูลหลักดังนั้นการค้นหาแบบไบนารีจึงเป็นไปไม่ได้และไม่มีค่าที่ไม่ซ้ำกันดังนั้นตารางจะต้องค้นหาจนถึงจุดสิ้นสุดสำหรับการN = 1,000,000เข้าถึงบล็อกที่ถูกต้อง เป็นสถานการณ์นี้ที่การทำดัชนีมีจุดมุ่งหมายเพื่อแก้ไข

เนื่องจากเรคคอร์ดดัชนีมีเฉพาะฟิลด์ที่จัดทำดัชนีและตัวชี้ไปยังเรกคอร์ดดั้งเดิมมันมีเหตุผลที่จะมีขนาดเล็กกว่าเรกคอร์ด multi-field ที่ชี้ไป ดังนั้นดัชนีเองจึงต้องการดิสก์บล็อกน้อยกว่าตารางดั้งเดิมซึ่งต้องใช้บล็อกน้อยกว่าในการเข้าถึงเพื่อวนซ้ำ สคีมาสำหรับดัชนีในฟิลด์FirstNameมีการระบุไว้ด้านล่าง

ชื่อเขตข้อมูลชนิดข้อมูลขนาดบนดิสก์
firstName Char (50) 50 ไบต์
(ตัวชี้บันทึก) พิเศษ 4 ไบต์

หมายเหตุ : ตัวชี้ใน MySQL มีความยาว 2, 3, 4 หรือ 5 ไบต์ขึ้นอยู่กับขนาดของตาราง

ตัวอย่างที่ 2 - การจัดทำดัชนี

รับฐานข้อมูลตัวอย่างของเรกr = 5,000,000คอร์ดที่มีความยาวเรกคอร์ดดัชนีR = 54ไบต์และใช้B = 1,024ไบต์ขนาดบล็อกเริ่มต้น ปัจจัยการปิดกั้นของดัชนีจะbfr = (B/R) = 1024/54 = 18บันทึกต่อดิสก์บล็อก จำนวนบล็อกทั้งหมดที่ต้องใช้เพื่อเก็บดัชนีคือN = (r/bfr) = 5000000/18 = 277,778บล็อก

ตอนนี้การค้นหาที่ใช้ฟิลด์FirstNameสามารถใช้ดัชนีเพื่อเพิ่มประสิทธิภาพได้ สิ่งนี้ช่วยให้การค้นหาแบบไบนารีของดัชนีที่มีค่าเฉลี่ยของการlog2 277778 = 18.08 = 19เข้าถึงบล็อก เพื่อหาที่อยู่ของระเบียนจริงซึ่งต้องมีการปิดกั้นการเข้าถึงเพิ่มเติมในการอ่านนำไปรวมกับ19 + 1 = 20การเข้าถึงบล็อกหนทางไกลจาก 1,000,000 บล็อกการเข้าถึงที่จำเป็นในการหาfirstNameแข่งขันในตารางที่ไม่ได้จัดทำดัชนี

ควรใช้เมื่อใด

เนื่องจากการสร้างดัชนีต้องการพื้นที่ดิสก์เพิ่มเติม (277,778 บล็อกพิเศษจากตัวอย่างข้างต้นเพิ่มขึ้น ~ 28%) และดัชนีมากเกินไปอาจทำให้เกิดปัญหาที่เกิดจากข้อ จำกัด ขนาดระบบไฟล์ต้องใช้ความคิดอย่างรอบคอบเพื่อเลือกสิ่งที่ถูกต้อง เขตข้อมูลที่จะจัดทำดัชนี

เนื่องจากดัชนีจะใช้เพื่อเพิ่มความเร็วในการค้นหาเขตข้อมูลที่ตรงกันภายในเร็กคอร์ดเท่านั้นทำให้เหตุผลที่ว่าการทำดัชนีฟิลด์ที่ใช้สำหรับเอาต์พุตจะเสียพื้นที่ดิสก์และเวลาในการประมวลผลเมื่อทำการแทรกหรือลบเท่านั้น ควรหลีกเลี่ยง เมื่อพิจารณาจากลักษณะของการค้นหาแบบไบนารีความสำคัญหรือความเป็นเอกลักษณ์ของข้อมูลเป็นสิ่งสำคัญ การจัดทำดัชนีในเขตข้อมูลที่มีระดับความสำคัญเป็น 2 จะแบ่งข้อมูลออกเป็นครึ่งส่วนในขณะที่ส่วนที่มีความสำคัญเชิงลบเท่ากับ 1,000 จะส่งกลับประมาณ 1,000 รายการ ด้วยความสำคัญที่ต่ำประสิทธิภาพจะลดลงเป็นการเรียงแบบเชิงเส้นและเคียวรีเครื่องมือเพิ่มประสิทธิภาพจะหลีกเลี่ยงการใช้ดัชนีถ้าความสำคัญน้อยกว่า 30% ของจำนวนบันทึกทำให้ดัชนีเสียพื้นที่อย่างมีประสิทธิภาพ


8
การค้นหาแบบไบนารี่สามารถทำได้เมื่อข้อมูลไม่ซ้ำกันใช่ไหม? แม้ว่าคุณจะกล่าวถึงความสำคัญน้อยที่สุด แต่อัลกอริทึมจะไม่เป็นการค้นหาแบบไบนารีอย่างง่ายการประมาณนี้ (~ log2 n) จะมีผลต่อเวลาของกระบวนการอย่างไร
แชมพู

9
@AbhishekShivkumar: คำถามยอดเยี่ยม! ฉันคิดว่าตารางดัชนีจะมีแถวได้มากเท่าที่มีอยู่ในตารางข้อมูล และเนื่องจากฟิลด์นี้จะมีเพียง 2 ค่า (บูลีนที่มีจริง / เท็จ) & บอกว่าคุณต้องการบันทึกที่มีค่าเป็นจริงจากนั้นคุณสามารถลดผลการตั้งค่าในการผ่านรอบแรกได้เพียงครึ่งหนึ่งในการส่งครั้งที่สอง ไม่มีพื้นฐานในการแยกความแตกต่างตอนนี้คุณต้องค้นหาตารางข้อมูลในแบบเชิงเส้นดังนั้นเขากล่าวว่าควรพิจารณาความสำคัญเชิงหัวใจขณะที่ตัดสินใจคอลัมน์ที่จัดทำดัชนี ในกรณีนี้มันไม่มีค่าที่จะจัดทำดัชนีในคอลัมน์ดังกล่าว หวังว่าฉันถูกต้อง :)
Saurabh Patil

7
(N+1)/2ไม่จำนวนการเข้าถึงบล็อกในกรณีเฉลี่ยที่ควรจะเป็น ถ้าเราสรุปจำนวนการเข้าถึงบล็อกสำหรับกรณีที่เป็นไปได้ทั้งหมดและหารด้วยจำนวนผู้ป่วยแล้วเรามีที่ออกมาจะN*(N+1)/(2*n) (N+1)/2
ajay

31
ฉันคิดว่ามีคำผิดในคำตอบนี้อยู่สองสามตัวอย่างเช่น "ประโยคที่ไกลจากการเข้าถึงบล็อก 277,778 บล็อกที่ตารางไม่ได้จัดทำดัชนี" ผู้เขียนไม่ได้หมายถึงการเข้าถึง 1,000,000 บล็อก? 277,778 คือจำนวนบล็อกที่ดัชนีต้องการ ดูเหมือนว่าจะมีความไม่ถูกต้องอีกสองสามอย่างเช่นกัน :(
jcm

5
@jcm เขาอธิบายไว้ใน "ส่วนการทำดัชนีคืออะไร" - "การจัดทำดัชนีเป็นวิธีการเรียงลำดับจำนวนของเร็กคอร์ดในหลายฟิลด์การสร้างดัชนีบนเขตข้อมูลในตารางจะสร้างโครงสร้างข้อมูลอื่นซึ่งเก็บค่าฟิลด์และตัวชี้ ไปยังระเบียนที่เกี่ยวข้องกับโครงสร้างดัชนีนี้จะถูกจัดเรียงแล้วอนุญาตให้ทำการค้นหาแบบไบนารี่ได้
กรินช์

294

ตัวอย่างคลาสสิก"ดัชนีในหนังสือ"

พิจารณา "หนังสือ" 1,000 หน้าโดยหารด้วย 10 บทแต่ละส่วนมี 100 หน้า

ง่ายใช่มั้ย

ตอนนี้ลองนึกภาพคุณต้องการค้นหาบทที่มีคำว่า " Alchemist " หากไม่มีหน้าดัชนีคุณไม่มีทางเลือกอื่นนอกจากสแกนผ่านหนังสือ / บททั้งหมด เช่น: 1,000 หน้า

การเปรียบเทียบนี้เรียกว่า"การสแกนแบบเต็มตาราง"ในโลกของฐานข้อมูล

ป้อนคำอธิบายรูปภาพที่นี่

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

แต่นอกเหนือจากที่เกิดขึ้นจริง 1,000 หน้าคุณจะต้องมีอีก 10 ~ หน้าเพื่อแสดงดัชนีดังนั้นทั้งหมด 1,010 หน้า

ดังนั้นดัชนีจึงเป็นส่วนแยกที่เก็บค่าของคอลัมน์ + ตัวชี้ดัชนีไปยังแถวที่จัดทำดัชนีตามลำดับที่จัดเรียงเพื่อการค้นหาที่มีประสิทธิภาพ

โรงเรียนเป็นเรื่องง่ายใช่มั้ย : P


24
การเปรียบเทียบที่ดีจริงๆ! ตลกฉันไม่ได้ทำการเชื่อมต่อระหว่างดัชนีหนังสือกับดัชนี db
Yolo Voe

2
นี่ทำให้ฉันคิดว่าLibraryหรือGrocery Store คุณคิดว่าจะไม่มีดัชนีที่ร้านขายของชำหรือไม่? Where's The Beef?!? Oh its next to the Restrooms, a mop, and makeup
JayRizzo

3
"แต่เมื่อเริ่มต้นหน้าดัชนีคุณก็อยู่ที่นั่น" "คุณอยู่ที่นั่น" หมายถึงอะไร
Frisbetarian

2
ดัชนีมักจะอยู่ด้านหลังของหนังสือในขณะที่สารบัญจะอยู่ข้างหน้า แต่นั่นทำให้การเปรียบเทียบดียิ่งขึ้นเนื่องจากลำดับคอลัมน์ไม่ควรสำคัญ
ยกเลิกการจัดระเบียบ

1
คำอธิบายของคุณนั้นง่ายมาก ๆ คนอื่น ๆ มักจะใช้คำศัพท์ที่ซับซ้อนเพื่ออธิบายสิ่งต่าง ๆ ฉันหวังว่าฉันจะสามารถโหวตได้มากกว่าหนึ่งครั้ง
emeraldhieu

240

ครั้งแรกที่ฉันอ่านมันเป็นประโยชน์กับฉันมาก ขอบคุณ.

ตั้งแต่นั้นมาฉันได้รับข้อมูลเชิงลึกเกี่ยวกับข้อเสียของการสร้างดัชนี: ถ้าคุณเขียนลงในตาราง ( UPDATEหรือINSERT) ด้วยดัชนีเดียวคุณจะมีการดำเนินการเขียนสองครั้งในระบบไฟล์ หนึ่งสำหรับข้อมูลตารางและอีกหนึ่งสำหรับข้อมูลดัชนี (และการหันของมัน (และ - ถ้าคลัสเตอร์ - การหันของข้อมูลตาราง)) หากตารางและดัชนีอยู่บนฮาร์ดดิสก์เดียวกันจะทำให้เสียเวลามากกว่า ดังนั้นตารางที่ไม่มีดัชนี (ฮีป) จะช่วยให้สามารถดำเนินการเขียนได้เร็วขึ้น (ถ้าคุณมีสองดัชนีคุณจะต้องจบด้วยการเขียนสามครั้งและอื่น ๆ )

อย่างไรก็ตามการกำหนดตำแหน่งที่แตกต่างกันสองแห่งบนฮาร์ดดิสก์สองตัวที่แตกต่างกันสำหรับข้อมูลดัชนีและข้อมูลตารางสามารถลด / ขจัดปัญหาค่าใช้จ่ายที่เพิ่มขึ้น สิ่งนี้ต้องการนิยามของกลุ่มไฟล์เพิ่มเติมที่มีไฟล์อ้างอิงบนฮาร์ดดิสก์ที่ต้องการและคำจำกัดความของตำแหน่งตาราง / ดัชนีตามต้องการ

ปัญหาอีกประการหนึ่งเกี่ยวกับดัชนีคือการแตกแฟรกเมนต์เมื่อเวลาผ่านไปเมื่อข้อมูลถูกแทรก REORGANIZEช่วยคุณต้องเขียนกิจวัตรเพื่อให้เสร็จ

ในบางสถานการณ์ฮีปมีประโยชน์มากกว่าตารางที่มีดัชนี

เช่น: - หากคุณมีงานเขียนจำนวนมาก แต่อ่านเพียงหนึ่งชั่วโมงนอกเวลาทำการเท่านั้นสำหรับการรายงาน

นอกจากนี้ความแตกต่างระหว่างดัชนีแบบคลัสเตอร์และแบบไม่รวมกลุ่มก็มีความสำคัญเช่นกัน

ช่วยฉันด้วย: - ดัชนีที่ทำคลัสเตอร์และไม่รวมกลุ่มหมายความว่าอย่างไร


3
ฉันคิดว่าปัญหาการจัดทำดัชนีเหล่านี้สามารถแก้ไขได้โดยการบำรุงรักษาฐานข้อมูลที่แตกต่างกันสองแห่งเช่นเดียวกับ Master และ Slave ตำแหน่งที่ Master สามารถใช้เพื่อแทรกหรืออัพเดตเรคคอร์ด โดยไม่ต้องจัดทำดัชนี และทาสสามารถใช้อ่านดัชนีที่เหมาะสมได้ ???
bharatesh

14
ไม่ผิดขอโทษ ไม่เพียง แต่เนื้อหาของตารางจะต้องได้รับการปรับปรุง แต่ยังรวมถึงโครงสร้างดัชนีและเนื้อหา (b-tree, nodes) แนวคิดเรื่องเจ้านายและทาสของคุณไม่สมเหตุสมผลเลย สิ่งที่สามารถทำได้แม้ว่าจะทำซ้ำหรือทำมิเรอร์ไปยังฐานข้อมูลที่สองซึ่งการวิเคราะห์เกิดขึ้นเพื่อลดปริมาณงานนั้นออกไปจากฐานข้อมูลแรก ฐานข้อมูลที่สองนั้นจะเก็บสำเนาของข้อมูลและดัชนีในข้อมูลนั้น
Der U

3
Ya ... ! ลองอ่านความคิดเห็นของฉันและทำความเข้าใจอย่างถูกต้อง ฉันยังกล่าวเช่นเดียวกันฉันเรียก master และ slave (อะไรก็ตาม) ว่า "eplicating หรือ mirroring ไปยังฐานข้อมูลที่สองซึ่งการวิเคราะห์เกิดขึ้นเพื่อลดปริมาณงานนั้นออกจากฐานข้อมูลแรกฐานข้อมูลที่สองจะเก็บสำเนาของข้อมูลและดัชนีบน ข้อมูลนั้น "
bharatesh

6
ฐานข้อมูลที่สอง - ซึ่งการทำมิรเรอร์หรือการเรพลิเคทเสร็จสิ้นทาส - จะได้สัมผัสกับการจัดการข้อมูลทั้งหมดที่ฐานข้อมูลแรกทำ ด้วยการดำเนินการ dml แต่ละครั้งดัชนีในฐานข้อมูลที่สองนั้นจะได้รับ "ปัญหาการจัดทำดัชนีเหล่านี้" ฉันไม่เห็นกำไรจากการทำดัชนีที่จำเป็นและสร้างขึ้นเพื่อการวิเคราะห์ที่รวดเร็วซึ่งจำเป็นต้องได้รับการปรับปรุงให้ทันสมัยอยู่เสมอ
Der U

230

ดัชนีเป็นเพียงโครงสร้างข้อมูลที่ทำให้การค้นหาเร็วขึ้นสำหรับคอลัมน์เฉพาะในฐานข้อมูล โครงสร้างนี้มักจะเป็น b-tree หรือ hash table แต่มันสามารถเป็นโครงสร้างตรรกะอื่น ๆ


29
+1 คูณล้านสำหรับคำตอบนี้เนื่องจากฉันพบรายชื่อนี้ในขณะที่พยายามหาคำอธิบายง่ายๆว่าการสร้างดัชนีนั้นคืออะไร
Josh Burson

1
โปรดทราบว่า "เพียงโครงสร้างข้อมูล" ไม่ได้หมายถึง "เพิ่มเติมข้อมูล" บางครั้งมันเป็น (เช่น "ดัชนีที่ไม่ใช่คลัสเตอร์") บางครั้งมันจะกำหนดรูปแบบของข้อมูล (เช่น "ดัชนีคลัสเตอร์")
Pablo H

160

ตอนนี้สมมติว่าเราต้องการเรียกใช้แบบสอบถามเพื่อค้นหารายละเอียดทั้งหมดของพนักงานที่มีชื่อว่า 'Abc'

SELECT * FROM Employee 
WHERE Employee_Name = 'Abc'

จะเกิดอะไรขึ้นหากไม่มีดัชนี

ซอฟต์แวร์ฐานข้อมูลจะต้องดูทุกแถวในตาราง Employee เพื่อดูว่า Employee_Name สำหรับแถวนั้นคือ 'Abc' และเนื่องจากเราต้องการแถวที่มีชื่อ 'Abc' ภายในนั้นเราไม่สามารถหยุดเพียงแค่มองทุกครั้งที่เราพบเพียงหนึ่งแถวที่มีชื่อ 'Abc' เพราะอาจจะมีแถวอื่น ๆ ที่มีชื่อAbc ดังนั้นทุกแถวจนถึงแถวสุดท้ายจะต้องค้นหาซึ่งหมายความว่าหลายพันแถวในสถานการณ์นี้จะต้องถูกตรวจสอบโดยฐานข้อมูลเพื่อค้นหาแถวที่มีชื่อ 'Abc' นี่คือสิ่งที่เรียกว่าการสแกนเต็มตาราง

ดัชนีฐานข้อมูลสามารถช่วยประสิทธิภาพได้อย่างไร

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

ดัชนีต้นไม้ B ทำงานอย่างไร

เหตุผล B- ต้นไม้เป็นโครงสร้างข้อมูลที่นิยมมากที่สุดสำหรับดัชนีเนื่องจากความจริงที่ว่าพวกเขามีประสิทธิภาพเวลา - เพราะการค้นหาการลบและการแทรกสามารถทำได้ในเวลาลอการิทึม และเหตุผลสำคัญอีกอย่างหนึ่งที่ใช้ต้นไม้บี - ทรีมากกว่านั้นก็เพราะว่าข้อมูลที่เก็บไว้ในต้นไม้นั้นสามารถจัดเรียงได้ RDBMS โดยทั่วไปจะกำหนดโครงสร้างข้อมูลที่ใช้จริงสำหรับดัชนี แต่ในบางสถานการณ์ด้วย RDBMS บางตัวคุณสามารถระบุโครงสร้างข้อมูลที่คุณต้องการให้ฐานข้อมูลของคุณใช้เมื่อคุณสร้างดัชนีเอง

ดัชนีตารางแฮชทำงานอย่างไร

เหตุผลที่ใช้ดัชนีแฮชเนื่องจากตารางแฮชมีประสิทธิภาพอย่างยิ่งเมื่อพูดถึงการค้นหาค่า ดังนั้นเคียวรีที่เปรียบเทียบความเสมอภาคกับสตริงสามารถดึงค่าได้อย่างรวดเร็วหากใช้ดัชนีแฮช

ตัวอย่างเช่นแบบสอบถามที่เรากล่าวถึงก่อนหน้านี้อาจได้รับประโยชน์จากดัชนีแฮชที่สร้างในคอลัมน์ Employee_Name วิธีที่ดัชนีแฮชจะทำงานคือค่าคอลัมน์จะเป็นกุญแจเข้าสู่ตารางแฮชและค่าจริงที่แมปกับคีย์นั้นจะเป็นตัวชี้ไปยังข้อมูลแถวในตาราง เนื่องจากตารางแฮชนั้นเป็นอาร์เรย์ที่เชื่อมโยงกันดังนั้นรายการทั่วไปจึงมีลักษณะคล้าย“ Abc => 0x28939″ โดยที่ 0x28939 เป็นข้อมูลอ้างอิงถึงแถวของตารางที่ Abc ถูกเก็บไว้ในหน่วยความจำ การค้นหาค่าเช่น "Abc" ในดัชนีตารางแฮชและรับการอ้างอิงกลับไปยังแถวในหน่วยความจำเห็นได้ชัดว่าเร็วกว่าการสแกนตารางเพื่อค้นหาแถวทั้งหมดที่มีค่า“ Abc” ในคอลัมน์ Employee_Name

ข้อเสียของดัชนีแฮช

ตารางแฮชไม่ได้จัดเรียงโครงสร้างข้อมูลและมีคิวรีหลายประเภทที่ดัชนีแฮชไม่สามารถช่วยได้ ตัวอย่างเช่นสมมติว่าคุณต้องการค้นหาพนักงานทั้งหมดที่มีอายุน้อยกว่า 40 ปี คุณจะทำอย่างไรกับดัชนีตารางแฮช มันเป็นไปไม่ได้เพราะตารางแฮชนั้นดีสำหรับการค้นหาคู่ของค่าคีย์ - ซึ่งหมายถึงเคียวรีที่ตรวจสอบความเท่าเทียมกัน

อะไรอยู่ภายในดัชนีฐานข้อมูล ดังนั้นตอนนี้คุณรู้แล้วว่าดัชนีฐานข้อมูลถูกสร้างขึ้นในคอลัมน์ในตารางและดัชนีเก็บค่าในคอลัมน์นั้น แต่สิ่งสำคัญคือต้องเข้าใจว่าดัชนีฐานข้อมูลไม่ได้เก็บค่าในคอลัมน์อื่น ๆ ของตารางเดียวกัน ตัวอย่างเช่นถ้าเราสร้างดัชนีในคอลัมน์ Employee_Name หมายความว่าค่าคอลัมน์ Employee_Age และ Employee_Address นั้นไม่ได้ถูกจัดเก็บไว้ในดัชนีด้วย หากเราเพิ่งเก็บคอลัมน์อื่น ๆ ทั้งหมดในดัชนีมันก็เหมือนกับการสร้างสำเนาของตารางทั้งหมด - ซึ่งจะใช้พื้นที่มากเกินไปและจะไม่มีประสิทธิภาพมาก

ฐานข้อมูลทราบได้อย่างไรว่าจะใช้ดัชนีเมื่อใด เมื่อมีการเรียกใช้แบบสอบถามเช่น“ เลือก * จากพนักงาน WHERE Employee_Name = 'Abc'” ฐานข้อมูลจะตรวจสอบว่ามีดัชนีในคอลัมน์ที่ถูกสอบถามหรือไม่ สมมติว่าคอลัมน์ Employee_Name มีดัชนีที่สร้างขึ้นฐานข้อมูลจะต้องตัดสินใจว่าเหมาะสมหรือไม่ที่จะใช้ดัชนีเพื่อค้นหาค่าที่กำลังค้นหา - เนื่องจากมีบางสถานการณ์ที่มีประสิทธิภาพน้อยกว่าในการใช้ดัชนีฐานข้อมูล และมีประสิทธิภาพยิ่งขึ้นเพียงแค่สแกนทั้งตาราง

ค่าใช้จ่ายของการมีดัชนีฐานข้อมูลคืออะไร?

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

ตามกฎทั่วไปดัชนีควรถูกสร้างขึ้นบนตารางเฉพาะเมื่อข้อมูลในคอลัมน์ดัชนีจะถูกสอบถามบ่อยครั้ง

ดูสิ่งนี้ด้วย

  1. โดยทั่วไปคอลัมน์ใดที่สร้างดัชนีที่ดี
  2. ดัชนีฐานข้อมูลทำงานอย่างไร

4
"ดัชนีฐานข้อมูลไม่ได้เก็บค่าในคอลัมน์อื่น ๆ " - ไม่เป็นความจริง
mustaccio

2
@mustaccio: ดัชนีจัดเก็บการอ้างอิงแถวพร้อมคอลัมน์ที่จัดทำดัชนีเท่านั้น (เท่าที่ฉันรู้) ฉันอาจจะผิด. คุณมีการอ้างอิงที่ระบุว่าดัชนีเก็บค่าคอลัมน์อื่น ๆ หรือไม่?
Somnath Muluk

3
@ To Downvoters: คุณเพียงแค่อธิบายว่ามีอะไรผิดปกติเพื่อให้ฉันสามารถปรับปรุงได้หรือไม่?
Somnath Muluk

2
ตรวจสอบตัวอย่างดัชนีคลัสเตอร์ SQL Server หรือCREATE INDEX ... INCLUDEส่วนคำสั่งของ DB2 คุณมีคำอธิบายโดยทั่วไปมากเกินไปในมุมมองของฉัน
mustaccio

11
@mustaccio: ดังนั้นโดยค่าเริ่มต้นcreate indexไม่รวมคอลัมน์อื่น ๆ และทำไมมันควร If we did just store all the other columns in the index, then it would be just like creating another copy of the entire table, which would take up way too much space and would be very inefficient.. นี่เป็นดัชนีเวอร์ชันทั่วไปมากขึ้น CREATE INDEX ... INCLUDEเป็นรุ่นที่ใหม่กว่าโดยพิจารณาจากคอลัมน์อื่น โพสต์ที่ฉันอธิบายมีการพิจารณารุ่นทั่วไปมากขึ้น ดัชนีจะทำงานเป็นหนังสือเล่มหนึ่งได้อย่างไรถ้าเราพิจารณาฐานข้อมูลทั้งหมด ไม่ใช่เหรอ คุณคิดว่าคำตอบควรได้รับ downvote หรือไม่?
Somnath Muluk

97

คำอธิบายง่ายๆ!

ดัชนีไม่มีอะไรเลยนอกจากโครงสร้างข้อมูลที่เก็บค่าสำหรับคอลัมน์เฉพาะในตาราง ดัชนีถูกสร้างขึ้นในคอลัมน์ของตาราง

ตัวอย่าง: เรามีตารางฐานข้อมูลที่เรียกว่าUserสามคอลัมน์ - Name, และAge Addressสมมติว่าUserตารางมีหลายพันแถว

ตอนนี้สมมติว่าเราต้องการเรียกใช้แบบสอบถามเพื่อค้นหารายละเอียดทั้งหมดของผู้ใช้ที่มีชื่อว่า 'John' ถ้าเราเรียกใช้แบบสอบถามต่อไปนี้:

SELECT * FROM User 
WHERE Name = 'John'

ซอฟต์แวร์ฐานข้อมูลจะต้องดูทุกแถวในUserตารางเพื่อดูNameว่าแถวนั้นคือ 'John' หรือไม่ การดำเนินการนี้จะใช้เวลานาน

ซึ่งเป็นที่ที่indexช่วยให้เรา: ดัชนีจะใช้ในการเพิ่มความเร็วในการค้นหาที่เป็นหลักโดยการตัดลงจำนวนของระเบียน / แถวในตารางที่จำเป็นต้องได้รับการตรวจสอบ

วิธีสร้างดัชนี:

CREATE INDEX name_index
ON User (Name)

indexประกอบด้วยค่าของคอลัมน์ (เช่น: จอห์น) จากตารางหนึ่งและค่านิยมเหล่านี้จะถูกเก็บไว้ในโครงสร้างข้อมูล

ดังนั้นตอนนี้ฐานข้อมูลจะใช้ดัชนีเพื่อค้นหาพนักงานที่ชื่อ John เพราะดัชนีจะเรียงลำดับตัวอักษรตามชื่อผู้ใช้ และเนื่องจากมีการเรียงลำดับหมายความว่าการค้นหาชื่อนั้นเร็วกว่ามากเพราะชื่อทั้งหมดที่ขึ้นต้นด้วย“ J” จะอยู่ติดกันในดัชนี!


1
ดัชนีไม่ได้บ่งบอกถึงการเรียงลำดับในคอลัมน์
oligofren

4
ขอบคุณ สิ่งนี้ช่วยให้ฉันเข้าใจ โดยพื้นฐานแล้วดัชนีเป็นแบบจำลองของข้อมูลคอลัมน์ที่เรียงลำดับแล้ว โดยปกติข้อมูลคอลัมน์อยู่ในลำดับที่ข้อมูลถูกแทรก
Neil

34

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


6
นี่คือความคิดเห็นไม่ใช่คำตอบ
RonJohn

5
มองเห็นได้ชัดเจนขึ้นและเป็นประโยชน์มากขึ้นด้วยวิธีนี้เนื่องจากเป็นข้อสังเกต คำตอบใดที่ควรถูกเพิ่มลงในความคิดเห็น
pfabri

1
อาจแสดงความคิดเห็นใน OP
guyarad

33

แค่คิดว่าฐานข้อมูลดัชนีเป็นดัชนีของหนังสือ

หากคุณมีหนังสือเกี่ยวกับสุนัขและต้องการหาข้อมูลเกี่ยวกับสมมติว่าคนเลี้ยงแกะเยอรมันคุณสามารถพลิกดูทุกหน้าของหนังสือและค้นหาสิ่งที่คุณต้องการ - แต่แน่นอนว่าใช้เวลานานและไม่ เร็วมาก.

ตัวเลือกอื่นคือคุณสามารถไปที่ส่วนดัชนีของหนังสือแล้วค้นหาสิ่งที่คุณกำลังค้นหาโดยใช้ชื่อของเอนทิตีที่คุณกำลังมองหา (ในกรณีนี้คือคนเลี้ยงแกะเยอรมัน) และดูหมายเลขหน้าของ ค้นหาสิ่งที่คุณต้องการได้อย่างรวดเร็ว

ในฐานข้อมูลหมายเลขหน้าถูกอ้างถึงเป็นตัวชี้ซึ่งนำฐานข้อมูลไปยังที่อยู่บนดิสก์ที่มีเอนทิตีตั้งอยู่ ด้วยการใช้การเปรียบเทียบเยอรมันเชพเพิร์ดแบบเดียวกันเราอาจมีสิ่งนี้ (“ เยอรมันเชพเพิร์ด”, 0x77129) ซึ่ง0x77129เป็นที่อยู่บนดิสก์ที่เก็บข้อมูลแถวสำหรับต้อนเยอรมันไว้

ในระยะสั้นดัชนีเป็นโครงสร้างข้อมูลที่เก็บค่าสำหรับคอลัมน์เฉพาะในตารางเพื่อเพิ่มความเร็วในการค้นหาแบบสอบถาม

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.