ดัชนีใน SQL คืออะไร


440

คืออะไรดัชนีใน SQL? คุณสามารถอธิบายหรืออ้างอิงเพื่อทำความเข้าใจได้อย่างชัดเจนหรือไม่

ฉันควรใช้ดัชนีที่ไหน

คำตอบ:


377

ดัชนีจะใช้เพื่อเร่งการค้นหาในฐานข้อมูล MySQL มีเอกสารที่ดีเกี่ยวกับเรื่องนี้ (ซึ่งเกี่ยวข้องกับเซิร์ฟเวอร์ SQL อื่น ๆ ด้วย): http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html

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

ดัชนียังสามารถเป็นUNIQUEดัชนีซึ่งหมายความว่าคุณไม่สามารถมีค่าซ้ำกันในคอลัมน์นั้นหรือPRIMARY KEYในเครื่องมือเก็บข้อมูลบางตัวจะกำหนดว่าไฟล์เก็บค่าไว้ที่ใดในไฟล์ฐานข้อมูล

ใน MySQL คุณสามารถใช้EXPLAINหน้าSELECTคำสั่งของคุณเพื่อดูว่าแบบสอบถามของคุณจะใช้ดัชนีใด ๆ นี่เป็นการเริ่มต้นที่ดีสำหรับการแก้ไขปัญหาประสิทธิภาพการทำงาน อ่านเพิ่มเติมได้ที่นี่: http://dev.mysql.com/doc/refman/5.0/en/explain.html


"ดัชนีสามารถเป็นดัชนีที่ไม่ซ้ำกัน ... " เพียงเพื่อยืนยันกับคุณนั่นหมายความว่าดัชนีอาจไม่ใช่แบบไม่ซ้ำได้หรือไม่ ฉันคิดเสมอว่ามันไม่เหมือนใคร ฉันค่อนข้างใหม่กับ SQL อภัยฉัน
Daniel Kurniadi

@DanielKurniadi ดัชนีส่วนใหญ่ไม่ซ้ำกัน ฉันอาจมีฐานข้อมูลผู้ใช้และต้องการค้นหาทุกคนที่อาศัยอยู่ในโกเธนเบิร์ก ดัชนีในฟิลด์ "เมือง" จะทำให้การค้นหาของฉันเร็วขึ้น แต่มีผู้ใช้มากกว่า 1 คนอาศัยอยู่ในโกเธนเบิร์กดังนั้นดัชนีต้องไม่ซ้ำกัน
Emil Vikström

174

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

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

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

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

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

หากคุณมีดัชนีที่ไม่ใช่แบบคลัสเตอร์บน (เมือง) ดังนั้นคำสั่งเหล่านี้สามารถทำได้เร็วกว่า

หวังว่าจะช่วย!


151

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

เพิ่มเติมที่นี่


2
ฉันชื่นชมผู้มีประสบการณ์อธิบายสิ่งต่าง ๆ โดยใช้ "การเปรียบเทียบ" +1
snr

82

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

ใน SQL Server ดัชนีคลัสเตอร์จะกำหนดลำดับทางกายภาพของข้อมูลในตาราง สามารถมีดัชนีคลัสเตอร์เดียวได้ต่อตาราง (ดัชนีคลัสเตอร์คือตาราง) ดัชนีอื่น ๆ ทั้งหมดในตารางถูกเรียกว่าไม่ใช่คลัสเตอร์


49

ดัชนีมีทั้งหมดเกี่ยวกับการหาข้อมูลได้อย่างรวดเร็ว

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

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

ข้อมูลพื้นฐานเกี่ยวกับดัชนีดัชนีแบบ
คลัสเตอร์และแบบไม่รวมกลุ่มดัชนีที่
ไม่ซ้ำใครและไม่ซ้ำ
ข้อดีและข้อเสียของดัชนี


การอ่านคำตอบทั้งหมดทำให้ฉันสงสัยว่าทำไมไม่จัดทำดัชนีทุกอย่าง +1 สำหรับการรวมลิงก์ที่มีข้อเสีย
Lakshay Garg

@LakshayGarg บางครั้งการทำดัชนีที่ไม่จำเป็นอาจทำให้เวลาในการดำเนินการของแบบสอบถามช้าลงดังนั้นเราไม่ควรลองทำดัชนีทุกอย่าง เหมือนทุกอย่างมีข้อดีและข้อเสียของตัวเอง
Gaurav Rajdeo

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

23

B-treeดีในดัชนีทั่วไปเป็น ดัชนีมีสองประเภทคือแบบคลัสเตอร์และแบบไม่คลัสเตอร์

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

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

ดัชนีใช้เพื่อเพิ่มความเร็วในการค้นหา เนื่องจากความซับซ้อนของ O (log N) ดัชนีมีขนาดใหญ่มากและน่าสนใจ ฉันสามารถพูดได้ว่าการสร้างดัชนีในฐานข้อมูลขนาดใหญ่บางครั้งก็เป็นงานศิลปะ


6
โดยทั่วไปแล้วมันเป็นต้นไม้ขมากกว่าต้นไม้ไบนารี
Mitch Wheat

ดังนั้นเนื่องจากดัชนีใช้ต้นไม้ที่ปรับสมดุลตัวเองทุกครั้งที่คุณเพิ่ม / ลบแถวมันจะทำให้ตัวเองสมดุล - ทำให้การแทรก / ลบมีราคาแพงกว่า ... ถูกต้องหรือไม่
David Refaeli

20

INDEXES - เพื่อค้นหาข้อมูลได้อย่างง่ายดาย

UNIQUE INDEX - ไม่อนุญาตให้ใช้ค่าซ้ำกัน

ไวยากรณ์สำหรับ INDEX

CREATE INDEX INDEX_NAME ON TABLE_NAME(COLUMN);

ไวยากรณ์สำหรับ UNIQUE INDEX

CREATE UNIQUE INDEX INDEX_NAME ON TABLE_NAME(COLUMN);

13

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

โดยไม่ต้องจัดทำดัชนี ดังนั้นสมมุติว่าการค้นหาคือ 50 มันจะต้องอ่าน 49 บันทึกเป็นการค้นหาเชิงเส้น

อ้างอิงภาพต่อไปนี้ (ภาพนี้ถ่ายจากวิดีโอนี้)

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

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


12

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

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

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

  1. เพื่อความเข้าใจอย่างชาญฉลาด cocnept: http://dotnetauthorities.blogspot.in/2013/12/Microsoft-SQL-Server-Training-Online-Learning-Classes-INDEX-Overview-and-Optimizations.html
  2. สำหรับการทำความเข้าใจการใช้งานอย่างชาญฉลาด: http://dotnetauthorities.blogspot.in/2013/12/Microsoft-SQL-Server-Training-Online-Learning-Classes-INDEX-Creation-Deletetion-Optimizations.html

6

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


6

หากคุณใช้ SQL Server หนึ่งในแหล่งข้อมูลที่ดีที่สุดคือ Books Online ที่มาพร้อมกับการติดตั้ง! มันเป็นที่ 1 ที่ฉันจะอ้างถึงสำหรับหัวข้อใด ๆ ที่เกี่ยวข้องกับ SQL Server

ถ้าเป็นจริง "ฉันจะทำอย่างไรดี" ชนิดของคำถามแล้ว StackOverflow จะเป็นสถานที่ที่ดีกว่าที่จะถาม

นอกจากนี้ฉันยังไม่ได้กลับมาอีกซักพัก แต่ sqlservercentral.com เคยเป็นหนึ่งในเว็บไซต์ที่เกี่ยวข้องกับ SQL Server อันดับต้น ๆ


0

on-disk structure associated with a table or view that speeds retrieval of rows from the table or viewดัชนีเป็น ดัชนีมีคีย์ที่สร้างขึ้นจากหนึ่งคอลัมน์ขึ้นไปในตารางหรือมุมมอง คีย์เหล่านี้ถูกเก็บไว้ในโครงสร้าง (ทรี B) ที่ช่วยให้ SQL Server สามารถค้นหาแถวหรือแถวที่เกี่ยวข้องกับค่าคีย์อย่างรวดเร็วและมีประสิทธิภาพ

Indexes are automatically created when PRIMARY KEY and UNIQUE constraints are defined on table columns. For example, when you create a table with a UNIQUE constraint, Database Engine automatically creates a nonclustered index.

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

โปรดอ้างอิงถึงสิ่งนี้สำหรับข้อมูลเพิ่มเติมเกี่ยวกับดัชนี (คลัสเตอร์และไม่ใช่คลัสเตอร์): https://docs.microsoft.com/en-us/sql/relational-database/indexes/clustered-and-nonclustered-indexes-described?view= SQL เซิร์ฟเวอร์ ver15

หวังว่านี่จะช่วยได้!

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