แนวทางปฏิบัติที่ดีที่สุดที่จะตามด้วยดัชนีฐานข้อมูล [ปิด]


17

อะไรคือ DOs และ DONT สำหรับการปรับปรุงประสิทธิภาพของฐานข้อมูลโดยใช้ดัชนี?

DO จะเป็นกรณีที่ควรสร้างดัชนีหรือดัชนีอื่นที่เกี่ยวข้องกับเคล็ดลับที่จะปรับปรุงประสิทธิภาพ

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


3
โปรไฟล์โปรไฟล์โปรไฟล์
GrandmasterB

คำตอบ:


15

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

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

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

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


17

มันขึ้นอยู่กับว่าคุณใช้ตารางของคุณอย่างไร ไม่มีคำตอบเดียวและเรียบง่าย

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

พวกเขามีอยู่สำหรับSQL Serverและออราเคิล ฉันไม่รู้ว่า DBMS อื่นมีหรือไม่ฉันสงสัยว่าพวกเขาไม่มีเครื่องมือพื้นฐานเช่นนั้น

การแนะนำแบบสุ่มน้อย:

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

คำแนะนำสุดท้าย : หากการแสดงฐานข้อมูลมีความสำคัญต่อโครงการของคุณจริงๆให้จ้างผู้เชี่ยวชาญ มันคือสิ่งที่ฉันทำ


2
+1 สำหรับดัชนีการรวมกันของคอลัมน์ ดัชนีในคอลัมน์aและbเป็นไม่ได้(a, b)เช่นเดียวกับดัชนีใน อันหลังเกือบจะดีเท่ากับดัชนีบนaสำหรับการเร่งคิวรีที่มีเงื่อนไขaเป็นอย่างดีกว่ามากสำหรับคิวรีที่มีเงื่อนไขaและbและไม่เป็นประโยชน์สำหรับเคียวรีbเพียงอย่างเดียว (ฐานข้อมูลส่วนใหญ่จะไม่ใช้งาน Oracle จะทำเช่นนั้น แต่จะไม่ได้รับไมล์สะสมจากการใช้งานปกติ)
btilly

2
+1 จะเพิ่ม "เรียนรู้ที่จะอ่านแผนแบบสอบถามเพื่อที่คุณจะได้รู้ว่าจะจัดทำดัชนี"
Steven A. Lowe

4

@ เปียโน 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 นาที


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

@Click Upvote: หากแบบสอบถามเข้าถึงมากกว่า 5% (เศษส่วนที่แน่นอนขึ้นอยู่กับฮาร์ดแวร์และข้อมูล) ของตารางจะเร็วกว่าหากไม่ใช้ดัชนีสำหรับแบบสอบถามนั้น มีดัชนีไม่เจ็บตราบใดที่คุณไม่ได้ใช้ ฉันจะอัปเดตรายละเอียดเพิ่มเติมว่าทำไมถึงเป็นเช่นนั้น
btilly

ข้อมูลที่เป็นประโยชน์. เพิ่มเติมเกี่ยวกับเรื่องนี้เช่นmysqlperformanceblog.com/2007/08/28/…แต่ฉันสงสัยว่าคือ 'ไม่สนใจคีย์' หรือไม่ถึงสิ่งที่คุณต้องทำให้เป็นแบบสอบถามย่อยหรือไม่
Inca

@Inca: ฉันไม่ได้ตระหนักถึง 'ละเว้นคีย์' ฉันสลับฐานข้อมูลเพียงพอที่มักจะมีสิ่งเฉพาะฐานข้อมูลที่ฉันไม่ทราบ จากเสียงของมันที่ใช้งานได้ แต่มีประสิทธิภาพน้อยกว่าโซลูชันในที่สุดของฉัน ความแตกต่างที่จะเข้าร่วมจากนั้นจัดกลุ่มในขณะที่ฉันจัดกลุ่มแล้วเข้าร่วม สิ่งนี้จะบันทึกงานในการเข้าร่วมเพราะต้องมีการเข้าร่วมระเบียนน้อยลง
btilly

"ฐานข้อมูลที่ดี (เช่น Oracle แต่ไม่ใช่ MySQL)": โปรดหลีกเลี่ยงการส่งเสริมการขายแบบโง่โดยเฉพาะอย่างยิ่งเมื่อคุณเพิกเฉยต่อข้อเท็จจริงที่ว่า MySQL สามารถใช้ดัชนีหลายรายการได้อย่างสมบูรณ์แบบในเวลาเดียวกัน .
Patrick Allaert

2

ทำ: จัดทำดัชนีฟิลด์น้อยที่สุดที่คุณเข้าถึงมากที่สุดผ่านการสืบค้นและ / หรือการเปรียบเทียบ

ไม่ได้: สร้างดัชนีทุกฟิลด์ในตารางโดยคิดว่ามันจะทำให้เร็วขึ้น

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


2

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

เขตข้อมูลใด ๆ ที่ใช้บ่อยสำหรับการเข้าร่วมการค้นหา / การเปรียบเทียบหรือการสั่งซื้อโดยเป็นตัวเลือกสำหรับดัชนี หากต้องการทราบว่ามันเป็นประโยชน์อย่างแท้จริงวัด อย่างไรก็ตามคีย์ต่างประเทศของตารางที่เข้าร่วมจำนวนมากที่มีจำนวนมาก (> 1,000s) ของบันทึกและส่วนแทรกจำนวนน้อยจะได้รับผลตอบแทน

สำหรับฟิลด์ข้อความคุณสามารถจัดทำดัชนีในส่วนของฟิลด์ (ตัวอย่างเช่น 6 ตัวอักษรแรก) ซึ่งจะทำให้การสืบค้นของคุณเร็วขึ้น แต่ทำให้น้ำหนักของดัชนีเบาลง การค้นหาข้อความแบบเต็ม (ค้นหาบนlike %substring%) ต้องใช้เทคนิคที่แตกต่างกันซึ่งฉันไม่คุ้นเคยดังนั้นฉันจึงไม่สามารถให้คำแนะนำได้

สถานการณ์สำคัญที่ดัชนีไม่สามารถช่วยเหลือได้: คุณไม่สามารถใช้ดัชนีของวันที่หรือเขตข้อมูลที่สมบูรณ์เมื่อคุณค้นหา (/ เข้าร่วม / คำสั่งซื้อ) ในบางส่วนของวันที่ ดัชนีในจะไม่ช่วยให้คุณมีแบบสอบถามเหมือนdate_created select * from t where year(date_created) = 2011ใน mysql คุณไม่สามารถสร้างดัชนีในส่วนของวันที่ (เมื่อคุณใช้ ' between' มากกว่าที่year()จะสามารถใช้ดัชนีในฟิลด์วันที่)

ข้อมูลเพิ่มเติมเกี่ยวกับ MYSQL ในคู่มือ: http://dev.mysql.com/doc/refman/5.6/th/optimization-indexes.html


1

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


1

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

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

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

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

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