ดัชนีจำเป็นสำหรับคีย์หลักใน SQLite หรือไม่


130

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

สถานการณ์จะแตกต่างไปจากคีย์หลักของสตริงหรือไม่

คำตอบ:


149

มันทำเพื่อคุณ

INTEGER PRIMARY KEY นอกจากข้อ จำกัด UNIQUE และ PRIMARY KEY จะถูกนำมาใช้โดยการสร้างดัชนีในฐานข้อมูล (ในลักษณะเดียวกับคำสั่ง "CREATE UNIQUE INDEX") ดัชนีดังกล่าวใช้เหมือนกับดัชนีอื่น ๆ ในฐานข้อมูลเพื่อเพิ่มประสิทธิภาพการสืบค้น ด้วยเหตุนี้จึงมักไม่มีข้อได้เปรียบ (แต่มีค่าใช้จ่ายที่สำคัญ) ในการสร้างดัชนีบนชุดคอลัมน์ที่รวมกันแล้วอยู่ภายใต้ข้อ จำกัด UNIQUE หรือ PRIMARY KEY


8
อันที่จริงมันระบุว่า "แอตทริบิวต์ PRIMARY KEY โดยปกติจะสร้างดัชนี UNIQUE ในคอลัมน์หรือคอลัมน์ที่ระบุเป็น PRIMARY KEY" อย่างไรก็ตามดัชนีนั้นไม่สามารถมองเห็นได้ในแอปพลิเคชันการจัดการ SQLite นั่นคือเหตุผลที่ฉันถาม
Marek Jedliński

1
มันพูดถึงในตารางที่มีชื่อขึ้นต้นด้วยsqlite_master sqlite_autoindex_
dan04

2
ล่าช้า แต่ @NicolasZozol ใช่คุณต้องสร้างUNIQUEดัชนี (หรือUNIQUEข้อ จำกัด ) ในฟิลด์หลัก / ที่อ้างอิงหากไม่มีอยู่ มันจะแนะนำว่าเด็ก / ข้อมูลอ้างอิง (s) มีดัชนี (ซึ่งมักจะไม่ซ้ำกัน): ดูที่นี่
TripeHound

2
อืมส่วนSQL Data Constraints ที่นี่กล่าวว่า: ในกรณีส่วนใหญ่ข้อ จำกัด UNIQUE และ PRIMARY KEY จะถูกนำมาใช้โดยการสร้างดัชนีเฉพาะในฐานข้อมูล (ข้อยกเว้นคือ INTEGER PRIMARY KEY และ PRIMARY KEY บนตารางที่ไม่มี ROWID) ดังนั้นคำตอบจึงไม่จริงเสมอไป?
ขี้เล่นขี้เล่น

3
ดูเหมือนว่า rowid IS ถูกจัดทำดัชนี แต่ใช้sqlite.org/lang_createtable.html#rowidต่างกันข้อมูลสำหรับตาราง rowid จะถูกจัดเก็บเป็นโครงสร้าง B-Tree ที่มีหนึ่งรายการสำหรับแต่ละแถวของตารางโดยใช้ค่า rowid เป็นคีย์ ... กำลังค้นหา สำหรับเร็กคอร์ดที่มี rowid เฉพาะ ... จะเร็วกว่าการค้นหาที่คล้ายกันประมาณสองเท่าโดยการระบุคีย์หลักอื่น ๆ หรือค่าที่จัดทำดัชนี
matreshkin

15

หากมีการทำเครื่องหมายคอลัมน์จำนวนเต็มคีย์หลักก็จริงรอบสองครั้งที่รวดเร็วเป็นค้นหาที่คล้ายกันทำโดยการระบุคีย์หลักอื่น ๆ หรือค่าจัดทำดัชนี นี้เป็นเพราะ:

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

ด้วยข้อยกเว้นหนึ่งข้อที่ระบุไว้ด้านล่างหากตาราง rowid มีคีย์หลักที่ประกอบด้วยคอลัมน์เดียวและประเภทที่ประกาศของคอลัมน์นั้นคือ "INTEGER"ในส่วนผสมของตัวพิมพ์ใหญ่และตัวพิมพ์เล็กคอลัมน์นั้นจะกลายเป็นนามแฝงสำหรับ rowid

คอลัมน์ดังกล่าวมักเรียกว่า "คีย์หลักจำนวนเต็ม" คอลัมน์ PRIMARY KEY จะกลายเป็นคีย์หลักจำนวนเต็มเท่านั้นหากชื่อประเภทที่ประกาศเป็น "INTEGER" ทั้งหมด ชื่อประเภทจำนวนเต็มอื่น ๆ เช่น "INT" หรือ "BIGINT" หรือ "SHORT INTEGER" หรือ "UNSIGNED INTEGER" ทำให้คอลัมน์คีย์หลักทำงานเป็นคอลัมน์ตารางธรรมดาที่มีความสัมพันธ์กับจำนวนเต็มและดัชนีที่ไม่ซ้ำกันไม่ใช่เป็นนามแฝงสำหรับ rowid

ดู: http://www.sqlite.org/lang_createtable.html#rowid


8

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

เมื่อสร้างแล้วจะใช้เมื่อจำเป็น

แน่นอนว่าจะไม่เป็นคลัสเตอร์เสมอไปและคุณจะระบุในสคีมาหากคุณต้องการให้เป็น

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