ความแตกต่างระหว่าง INDEX, Primary, UNIQUE, FULLTEXT ใน MySQL หรือไม่?


610

อะไรคือความแตกต่างระหว่าง Primary, UNIQUE, INDEX และ FULLTEXT เมื่อสร้างตาราง MySQL?

ฉันจะใช้มันอย่างไร


3
นอกจากนี้สำหรับทุกคนที่อยากรู้อยากเห็นSPATIAL: stackoverflow.com/questions/2256364/ …
Leo

สำหรับการเปรียบเทียบหลักกับดัชนีรองใน Python ดูบทความนี้stackoverflow.com/questions/59918440/secondary-index-in-python
Athanassios

คำตอบ:


674

ความแตกต่าง

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

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

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

  • Primaryทำหน้าที่เหมือนกับดัชนี UNIQUE ยกเว้นว่ามันจะมีชื่อว่า 'primary' เสมอและอาจมีเพียงรายการเดียวในตาราง (และควรมีเพียงรายการเดียวเสมอ) แม้ว่าระบบฐานข้อมูลบางระบบจะไม่บังคับใช้ก็ตาม) ดัชนีหลักมีจุดประสงค์เพื่อเป็นวิธีการหลักในการระบุแถวใด ๆ ในตารางโดยเฉพาะดังนั้นไม่เหมือนกับ UNIQUE ซึ่งไม่ควรใช้กับคอลัมน์ใด ๆ ที่อนุญาตให้มีค่า NULL ดัชนีหลักของคุณควรอยู่ในจำนวนคอลัมน์ที่เล็กที่สุดซึ่งเพียงพอที่จะระบุแถวโดยไม่ซ้ำกัน บ่อยครั้งที่นี่เป็นเพียงหนึ่งคอลัมน์ที่มีตัวเลขที่เพิ่มขึ้นโดยอัตโนมัติ แต่หากมีสิ่งอื่นใดที่สามารถระบุแถวเช่น "countrycode" ในรายการประเทศคุณสามารถใช้แทนได้

    ระบบฐานข้อมูลบางระบบ (เช่น InnoDB ของ MySQL) จะเก็บบันทึกของตารางไว้ในดิสก์ตามลำดับที่ปรากฏในดัชนีหลัก

  • ดัชนีFULLTEXTนั้นแตกต่างจากทั้งหมดข้างต้นและพฤติกรรมของพวกเขาแตกต่างกันอย่างมากระหว่างระบบฐานข้อมูล ดัชนี FULLTEXT มีประโยชน์สำหรับการค้นหาข้อความแบบเต็มที่ทำด้วยประโยค MATCH () / ต่อ (ไม่เหมือนกับสามข้อข้างต้น) ซึ่งโดยทั่วไปแล้วจะนำไปใช้ภายในโดยใช้ b-trees (อนุญาตให้เลือกเรียงลำดับหรือช่วงที่เริ่มจากคอลัมน์ซ้ายสุด) หรือ ตารางแฮช (อนุญาตให้เลือกโดยเริ่มจากคอลัมน์ซ้ายสุด)

    ในกรณีที่ดัชนีประเภทอื่นเป็นจุดประสงค์ทั่วไปดัชนี FULLTEXT มีความเชี่ยวชาญเฉพาะในการใช้เพื่อวัตถุประสงค์แคบ ๆ : มันใช้สำหรับการค้นหาข้อความแบบเต็มเท่านั้น

ความคล้ายคลึงกัน

  • ดัชนีเหล่านี้ทั้งหมดอาจมีคอลัมน์มากกว่าหนึ่งคอลัมน์

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


2
หมายความว่าดัชนี FULLTEXT นั้นไร้ประโยชน์และเป็นพื้นที่ว่างถ้าคุณไม่ใช้ MATCH () / กับอีกครั้ง () ในการสืบค้นของคุณ?
user1397417

5
ใช่. มันยังใช้สำหรับฐานข้อมูล MyISAM บน MySQL เท่านั้นไม่ใช่ InnoDB เซิร์ฟเวอร์ฐานข้อมูลอื่น ๆ อาจมีคุณสมบัติเทียบเท่าที่อาจทำงานแตกต่างกัน
thomasrutter

"ไม่ควรใช้กับคอลัมน์ใด ๆ ที่อนุญาตค่า NULL" -> สิ่งนี้ควรเป็น "ไม่สามารถใช้งานได้" NOT NULLคีย์หลักอยู่ที่จำเป็น MySQL จะรายงานshow columnsว่าคีย์เฉพาะที่ไม่ใช่ค่า NULL นั้นเป็นคีย์หลักหากไม่มีการกำหนดคีย์หลักอื่น
Gordon Linoff

1
เหตุผลที่นี่คือ NULL ถือว่าไม่เท่ากับตัวเอง .. ฮ่า ๆ ๆ ฉันจะไม่ลืมสิ่งนี้
Hos Mercury

2
@thomasrutter MySQL สนับสนุน FULLTEXT ใน InnoDB จากรุ่น 5.6
Marek Skiba

151

ทั้งหมดนี้เป็นดัชนีประเภทต่างๆ

หลัก:จะต้องไม่ซ้ำกันเป็นดัชนีเป็น (น่าจะ) ดัชนีทางกายภาพสามารถมีเพียงหนึ่งต่อตาราง

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

ดัชนี:หากไม่ใช่หลักหรือไม่ซ้ำกันมันจะไม่ จำกัด ค่าที่แทรกลงในตาราง แต่จะอนุญาตให้ค้นหาได้อย่างมีประสิทธิภาพยิ่งขึ้น

fulltext:การจัดทำดัชนีแบบพิเศษที่อนุญาตการค้นหาข้อความแบบเต็ม คิดว่าเป็น (โดยพื้นฐาน) การสร้าง "ดัชนี" สำหรับแต่ละคำว่า "" ในคอลัมน์ที่ระบุ


32
Primarys สามารถเป็นคอมโพสิตเช่น multi-key ใน MySQL (และฐานข้อมูลอื่น ๆ ) มันเป็นเพียงดัชนีพิเศษ ที่ไม่ซ้ำกันไม่ได้เป็นดัชนีจริงๆมันเป็นข้อ จำกัด (ซึ่งต้องใช้ดัชนีในการบังคับใช้ในจำนวนเวลาที่เหมาะสมจึงสร้างหนึ่ง)
MBCook

19

ฉันรู้สึกว่าสิ่งนี้ได้รับการคุ้มครองอย่างดีอาจยกเว้นดังต่อไปนี้:

  • Simple KEY/ INDEX(หรือเรียกอีกอย่างว่าSECONDARY INDEX) จะเพิ่มประสิทธิภาพหากการเลือกมีเพียงพอ ในเรื่องนี้คำแนะนำปกติคือถ้าจำนวนของเร็กคอร์ดในชุดผลลัพธ์ที่ใช้ดัชนีเกินกว่า 20% ของจำนวนเร็กคอร์ดทั้งหมดของตารางพาเรนต์ดัชนีจะไม่ได้ผล ในการปฏิบัติแต่ละสถาปัตยกรรมจะแตกต่างกัน แต่ความคิดยังคงถูกต้อง

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

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

  • คุณสามารถใช้FULLTEXT(หรือเรียกอย่างอื่นSEARCH INDEX) กับ Innodb (ใน MySQL 5.6.4 ขึ้นไป) และ Myisam Engines

  • คุณสามารถใช้FULLTEXTบนCHAR, VARCHARและTEXTประเภทคอลัมน์
  • FULLTEXTดัชนีเกี่ยวข้องมากกว่าการสร้างดัชนี มีกลุ่มของตารางระบบที่สร้างขึ้นเป็นระบบแคชที่แยกจากกันอย่างสมบูรณ์และมีการใช้กฎและการปรับให้เหมาะสมบางอย่างโดยเฉพาะ ดูhttp://dev.mysql.com/doc/refman/5.7/en/fulltext-restrictions.htmlและhttp://dev.mysql.com/doc/refman/5.7/en/innodb-fulltext-index.html
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.