คีย์หลักถูกทำดัชนีโดยอัตโนมัติใน MySQL หรือไม่


คำตอบ:


294

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


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

35
@tim: พวกเขากำลังบอกผู้คนให้แน่ใจว่าคอลัมน์อื่น ๆ ที่ใช้สำหรับการกรองการจัดกลุ่มหรือการเรียงลำดับก็มีดัชนีเช่นกัน
Emil H

15
อย่าลืมเข้าร่วมด้วย! เขตข้อมูลการรวมที่จัดทำดัชนีจะช่วยเร่งความเร็ว
JustJohn

31

ตามที่http://dev.mysql.com/doc/refman/5.0/en/constraint-primary-key.htmlมันจะปรากฏว่านี่จะเป็นนัย


1
ฉันพบลิงค์นั้นด้วยการค้นหาก่อนถามคำถาม แต่ดูเหมือนจะไม่ได้หมายความว่าอย่างใดอย่างหนึ่งเกี่ยวกับคำถามนี้กับฉัน
Alex Miller

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

16

แม้ว่าสิ่งนี้ถูกถามในปี 2009 ฉันคิดว่าฉันโพสต์การอ้างอิงจริงไปยังเอกสาร MySQL ในคีย์หลัก http://dev.mysql.com/doc/refman/5.5/en/optimizing-primary-keys.html

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

สำหรับการอ้างอิง MySQL 5.0 โปรดดู: http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html

ดัชนี MySQL ส่วนใหญ่( คีย์หลัก , UNIQUE, INDEX และ FULLTEXT) จะถูกเก็บไว้ใน B-trees ข้อยกเว้นคือดัชนีในชนิดข้อมูลเชิงพื้นที่ใช้ R-trees และตาราง MEMORY นั้นยังสนับสนุนดัชนีแฮช


11

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



8

ฉันเดาว่านี่คือคำตอบ

mysql> create table test(id int primary key, s varchar(20));
Query OK, 0 rows affected (0.06 sec)

mysql> show indexes from test \G
*************************** 1. row ***************************
        Table: test
   Non_unique: 0
     Key_name: PRIMARY
 Seq_in_index: 1
  Column_name: id
    Collation: A
  Cardinality: 0
     Sub_part: NULL
       Packed: NULL
         Null:
   Index_type: BTREE
      Comment:
Index_comment:
1 row in set (0.00 sec)

7

ดัชนีจะใช้ดีที่สุดในคอลัมน์ที่ใช้บ่อยในที่ที่คำสั่งและในการเรียงลำดับใด ๆ เช่น "เรียงตาม" คุณอาจกำลังทำงานกับฐานข้อมูลที่ซับซ้อนมากขึ้นดังนั้นจึงควรจำกฎง่ายๆ

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

  • ดัชนีมีประโยชน์เฉพาะกับตารางที่มีแถวจำนวนมากเท่านั้น

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

  • อย่าลืมเข้าร่วมด้วย! เขตข้อมูลการรวมที่จัดทำดัชนีจะช่วยเร่งความเร็วสิ่งต่างๆ


4

คีย์หลักจะถูกทำดัชนีโดยอัตโนมัติและไม่ซ้ำกัน ดังนั้นระวังอย่าสร้างดัชนีซ้ำซ้อน

ตัวอย่างเช่นถ้าคุณสร้างตารางเช่น

CREATE TABLE mytable (foo INT NOT NULL PRIMARY KEY, bar INT NOT NULL, baz INT NOT NULL,
  UNIQUE(foo), INDEX(foo)) ENGINE=InnoDB;

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


0

เราสามารถนึกถึงคอลัมน์คีย์หลักเป็นคอลัมน์อื่น ๆ ที่จัดทำดัชนีโดยมีข้อ จำกัด ของคีย์หลักมาด้วย

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

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