“ ดัชนี” หมายถึงอะไรใน RDBMS [ปิด]


21

ฉันใช้ดัชนีอย่างที่ผู้พัฒนาส่วนใหญ่ทำ (ส่วนใหญ่อยู่บน ... ดี! ดัชนี) แต่ฉันแน่ใจว่ามีวิธีที่ละเอียดอ่อนมากมายในการปรับฐานข้อมูลโดยใช้ดัชนี ฉันไม่แน่ใจว่าเฉพาะเจาะจงกับการใช้งาน DBMS หรือไม่

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


เมื่อคิดถึงคำถามนี้ต่อไปคำถามนี้กว้างเกินไปสำหรับไซต์นี้ หากเราเปลี่ยนขอบเขตของคำถามที่อาจเหมาะสมมิฉะนั้นคำถามนี้ไม่เหมาะสำหรับไซต์
jcolebrand

ฉันชอบที่จะอธิบายดัชนีโดยใช้คำเปรียบเทียบของไลบรารีmysqlperformanceblog.com/2011/08/30/…ดูว่าช่วยได้ไหม ..
Jonathan

คำตอบ:


11

คิดว่าดัชนีเป็น "สารบัญ" ... ซึ่งเป็นรายการคำสั่งของตัวชี้ไปยังตำแหน่งในไฟล์หรือที่รู้จักกันว่าออฟเซ็ต สมมติว่าคุณมีบันทึกหลายล้านระเบียนในตารางแทนที่จะค้นหาเกณฑ์การจับคู่ตารางจะเร็วกว่ามากในการอ้างอิงรายการที่สั่งซื้อสำหรับการจับคู่จากนั้นซ้อนตัวชี้ไปยังแถวการจับคู่ที่เฉพาะเจาะจง ตัวอย่างที่สมบูรณ์แบบของดัชนีคือเขตข้อมูลคีย์หลักของตารางโดยทั่วไปแล้วฟิลด์ "id" หากคุณต้องการ ID แถว # 11234566 มันเร็วกว่าถามดัชนีสำหรับตัวชี้ไปยังข้อมูลมากกว่าที่จะสแกนแหล่งข้อมูลสำหรับตำแหน่ง 11234566

นี่คือการใช้การจัดทำดัชนีที่ไม่ชัดเจนนัก:

CREATE TABLE activity_log (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
activity_type_id SMALLINT UNSIGNED NOT NULL,
datetime_created DATETIME
KEY(activity_type_id),
PRIMARY KEY(id)
);
CREATE TABLE activity_log_to_date_key (
activity_log_id INT UNSIGNED NOT NULL,
date_created_key  INT UNSIGNED NOT NULL REFERENCES dim_datetime(id),
UNIQUE KEY(activity_log_id),
KEY(date_created_key)
);
CREATE TABLE dim_datetime (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
date_hour DATETIME NOT NULL,
PRIMARY KEY(id),
KEY(date_hour)
);

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

แบบสอบถามตัวอย่าง:

SELECT a.activity_log_id, al.activity_type_id, al.datetime_created
FROM activity_log_to_date_key a 
INNER JOIN dim_datetime d ON (d.id = a.date_created_key)
LEFT JOIN activity_log al ON (al.id = a.activity_log_id)
WHERE d.date_hour BETWEEN '2009-01-01 00:00:00' AND '2009-06-01 12:00:00';

ขอบคุณนั่นชัดเจนมาก! ในตัวอย่างของคุณ "หลัก" จะเปลี่ยนวิธีที่ RDMBS จัดเก็บ "ออฟเซ็ต" หรือจะใช้เพื่อ จำกัด ข้อ จำกัด เฉพาะเท่านั้น
โทมัส Joulin

9

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

ตัวอย่างเช่นหากค้นหาตารางขนาดใหญ่สำหรับแถวWHERE AnIntegerColumn = 42 AND AnOtherInt = 69เส้นทางที่เร็วที่สุดไปยังแถวเหล่านั้นจะเป็นดัชนีในสองคอลัมน์ AnIntegerColumn และ AnOtherInt หากคุณมีดัชนีในแต่ละรายการ แต่ไม่มีดัชนีรวมกันฐานข้อมูลจะค้นหาดัชนีหนึ่งหรือดัชนีอื่นและแยกกรองผลลัพธ์ด้วยส่วนคำสั่งที่สองหรือแยกทั้งสองและสแกนผลลัพธ์แล้วแต่งงานกันในภายหลัง

การดำเนินการอย่างง่ายทั่วไปอื่นที่สามารถปรับปรุงได้ด้วยดัชนีคอมโพสิตคือWHERE SomeColumn = <SomeValue> ORDER BY SomeOtherColumn- ถ้ามีดัชนีใน SomeColumn และ SomeOtherColumn (ตามลำดับที่ถูกต้อง) การดำเนินการกรองและการสั่งซื้อสามารถทำได้ในเวลาเดียวกันในบางสถานการณ์

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


2

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


หากต้องการเพิ่มคำตอบของ Gaurav ให้ใช้ "EXPLAIN EXTENDED" จากนั้นพิมพ์ "SHOW WARNINGS" ทันทีเพื่อดูว่าคำแปลของคุณแปลอย่างไร
randomx

1

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


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

1
@gaius ฉันค่อนข้างจะหมายถึงถ้าคุณไม่มีการตั้งค่า RAID5 (หรือสิ่งที่คล้ายกัน) เพื่อใส่ดัชนีใน E: ข้อมูลใน F:, ฯลฯ
jcolebrand
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.