Là khóa chính được tự động lập chỉ mục trong MySQL?


243

Bạn có cần phải tạo một chỉ mục một cách rõ ràng, hoặc nó ẩn khi xác định khóa chính? Câu trả lời có giống với MyISAM và InnoDB không?

Câu trả lời:


294

Khóa chính luôn được lập chỉ mục. Điều này giống với MyISAM và InnoDB, và nói chung đúng với tất cả các công cụ lưu trữ mà ở tất cả các chỉ số hỗ trợ.


5
Nếu khóa chính luôn được lập chỉ mục, tại sao mọi người khi nói về kiến ​​trúc / hiệu suất cơ sở dữ liệu luôn khuyên người mới sử dụng SQL "đảm bảo cơ sở dữ liệu của họ được lập chỉ mục đúng"?
tim peterson

35
@tim: Họ đang nói với mọi người để đảm bảo rằng bất kỳ cột nào khác được sử dụng để lọc, nhóm hoặc sắp xếp cũng có chỉ số.
Emil H

15
Đừng quên tham gia quá! Các trường tham gia được lập chỉ mục tăng tốc mọi thứ.
JustJohn

31

Theo http://dev.mysql.com/doc/refman/5.0/en/constraint-primary-key.html có vẻ như điều này sẽ được ẩn


1
Tôi tìm thấy liên kết đó bằng cách tìm kiếm trước khi tôi đặt câu hỏi. Nhưng nó dường như không ngụ ý rằng hoặc bất cứ điều gì khác nhiều về câu hỏi này với tôi.
Alex Miller

Trang được liên kết đến trong câu trả lời này dường như không nói gì về việc liệu khóa chính cũng là một chỉ mục. Các trang được liên kết đến trong câu trả lời từ @fyrye có liên quan hơn.
George Hawkins

16

Mặc dù điều này đã được hỏi trong năm 2009, tôi vẫn muốn đăng một tài liệu tham khảo thực tế đến tài liệu MySQL trên các khóa chính. http://dev.mysql.com/doc/refman/5.5/en/optimizing-primary-keys.html

Khóa chính cho bảng biểu thị cột hoặc tập hợp các cột mà bạn sử dụng trong các truy vấn quan trọng nhất của mình. Nó có một chỉ mục liên quan, cho hiệu suất truy vấn nhanh

Để tham khảo MySQL 5.0, hãy xem: http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html

Hầu hết các chỉ mục MySQL ( PRIMARY KEY , UNIQUE, INDEX và FULLTEXT) được lưu trữ trong cây B. Các ngoại lệ là các chỉ mục trên các loại dữ liệu không gian sử dụng cây R và các bảng MEMOR cũng hỗ trợ các chỉ mục băm.


11

Khóa chính được lập chỉ mục ngầm cho cả MyISAM và InnoDB. Bạn có thể xác minh điều này bằng cách sử dụng EXPLAIN trên truy vấn sử dụng khóa chính.


9

Bạn không nhất thiết phải tạo một chỉ mục cho khóa chính ... nó được thực hiện theo mặc định.


8

Tôi đoán đây là câu trả lời

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

Các chỉ mục được sử dụng tốt nhất trên các cột thường được sử dụng trong các mệnh đề và trong bất kỳ loại sắp xếp nào, chẳng hạn như "sắp xếp theo". Bạn có thể đang làm việc trên một cơ sở dữ liệu phức tạp hơn, vì vậy thật tốt khi nhớ một vài quy tắc đơn giản.

  • Các chỉ mục làm chậm các phần chèn và cập nhật, vì vậy bạn muốn sử dụng chúng một cách cẩn thận trên các cột được cập nhật TẦN SỐ.
  • Chỉ mục tăng tốc nơi mệnh đề và thứ tự theo. Hãy nhớ nghĩ về cách dữ liệu của bạn sẽ được sử dụng khi xây dựng các bảng của bạn. Có một vài điều khác cần nhớ. Nếu bảng của bạn rất nhỏ, tức là chỉ có một vài nhân viên, việc sử dụng một chỉ mục sẽ tệ hơn là để nó ra ngoài và chỉ để nó thực hiện quét bảng.

  • Các chỉ mục thực sự chỉ có ích với các bảng có nhiều hàng.

  • Một điều cần nhớ, đó là một khuyết điểm trong tình huống cơ sở dữ liệu của nhân viên chúng tôi, đó là nếu cột có độ dài thay đổi, các chỉ mục (cũng như hầu hết MySQL) hoạt động kém hiệu quả hơn nhiều.

  • Đừng quên tham gia quá! Các trường tham gia được lập chỉ mục tăng tốc mọi thứ.


4

Khóa chính luôn được lập chỉ mục tự động và duy nhất. Vì vậy, hãy cẩn thận để không tạo ra các chỉ mục dư thừa.

Chẳng hạn, nếu bạn đã tạo một bảng như vậy

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

bởi vì bạn muốn lập chỉ mục khóa chính và thực thi một ràng buộc duy nhất trên nó, cuối cùng bạn thực sự sẽ tạo ra ba chỉ mục foo!


0

Người ta có thể nghĩ về một cột khóa chính như bất kỳ cột được lập chỉ mục nào khác với các ràng buộc của khóa chính mang theo nó.

Trong hầu hết các trường hợp sử dụng, chúng tôi cần cả khóa chính và cột / cột được lập chỉ mục trong một bảng, bởi vì các truy vấn của chúng tôi có thể lọc các hàng dựa trên cột / cột không phải là khóa chính, trong trường hợp đó chúng tôi thường lập chỉ mục các cột / cột đó cũng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.