Sự khác nhau giữa INDEX, PRIMARY, UNIITE, FULLTEXT trong MySQL?


609

Sự khác biệt giữa PRIMARY, UNIQUE, INDEX và FULLTEXT khi tạo các bảng MySQL là gì?

Làm thế nào tôi sẽ sử dụng chúng?


3
Ngoài ra cho bất kỳ ai tò mò về SPATIAL: stackoverflow.com/questions/2256364/ từ
Leo

Để so sánh giá trị chính với chỉ số phụ trong Python, hãy xem bài đăng này stackoverflow.com/questions/59918440/secondary-index-in-python
Athanassios

Câu trả lời:


674

Sự khác biệt

  • KEY hoặc INDEX đề cập đến một chỉ mục không duy nhất bình thường. Các giá trị không phân biệt cho chỉ mục được cho phép, vì vậy chỉ mục có thể chứa các hàng có giá trị giống hệt nhau trong tất cả các cột của chỉ mục. Các chỉ mục này không thực thi bất kỳ hạn chế nào trên dữ liệu của bạn để chúng chỉ được sử dụng để truy cập - để nhanh chóng đạt được một số bản ghi nhất định mà không quét tất cả các bản ghi.

  • UNIQUE đề cập đến một chỉ mục trong đó tất cả các hàng của chỉ mục phải là duy nhất. Nghĩa là, cùng một hàng có thể không có các giá trị không phải NULL giống hệt nhau cho tất cả các cột trong chỉ mục này dưới dạng một hàng khác. Ngoài việc được sử dụng để nhanh chóng đạt đến các phạm vi bản ghi nhất định, các chỉ mục UNIQUE có thể được sử dụng để thực thi các hạn chế trên dữ liệu, vì hệ thống cơ sở dữ liệu không cho phép phá vỡ quy tắc giá trị riêng biệt khi chèn hoặc cập nhật dữ liệu.

    Hệ thống cơ sở dữ liệu của bạn có thể cho phép áp dụng một chỉ mục UNIQUE cho các cột cho phép các giá trị NULL, trong trường hợp đó hai hàng được phép giống hệt nhau nếu cả hai đều chứa một giá trị NULL (lý do ở đây là NULL được coi là không bằng chính nó). Tuy nhiên, tùy thuộc vào ứng dụng của bạn, bạn có thể thấy điều này không mong muốn: nếu bạn muốn ngăn chặn điều này, bạn nên không cho phép các giá trị NULL trong các cột có liên quan.

  • TIỂU hoạt động hệt như một chỉ số UNIQUE, ngoại trừ việc nó luôn được đặt tên là 'TIỂU', và có thể chỉ có một trên một bảng (và có nên luôn luôn là một, mặc dù một số hệ thống cơ sở dữ liệu không thực thi này). Chỉ mục CHÍNH được dùng như một phương tiện chính để xác định duy nhất bất kỳ hàng nào trong bảng, do đó, không giống như UNIQUE, không nên sử dụng nó trên bất kỳ cột nào cho phép giá trị NULL. Chỉ mục CHÍNH của bạn phải ở số lượng cột nhỏ nhất đủ để xác định một hàng duy nhất. Thông thường, đây chỉ là một cột chứa số tăng tự động duy nhất, nhưng nếu có bất kỳ thứ gì khác có thể xác định duy nhất một hàng, chẳng hạn như "mã quốc gia" trong danh sách các quốc gia, bạn có thể sử dụng số đó thay thế.

    Một số hệ thống cơ sở dữ liệu (chẳng hạn như InnoDB MySQL) sẽ lưu giữ hồ sơ của một bảng trên đĩa theo thứ tự mà chúng xuất hiện trong chỉ mục TIỂU.

  • Các chỉ mục FULLTEXT khác với tất cả các mục trên và hành vi của chúng khác nhau đáng kể giữa các hệ thống cơ sở dữ liệu. Chỉ số toàn văn chỉ hữu ích cho tìm kiếm văn bản đầy đủ thực hiện với sự MATCH () khoản / AGAINST (), không giống như ở trên ba - mà thường được thực hiện trong nội bộ sử dụng b-cây (cho phép lựa chọn, phân loại hoặc dãy bắt đầu từ hầu hết các cột bên trái) hoặc bảng băm (cho phép lựa chọn bắt đầu từ hầu hết các cột bên trái).

    Trong trường hợp các loại chỉ số khác đều có mục đích chung, một chỉ mục toàn văn chuyên, ở chỗ nó phục vụ một mục đích hẹp: nó chỉ được sử dụng cho một tính năng "tìm kiếm đầy đủ văn bản".

Điểm tương đồng

  • Tất cả các chỉ mục này có thể có nhiều hơn một cột trong đó.

  • Ngoại trừ FULLTEXT, thứ tự cột rất quan trọng: để chỉ mục có ích trong truy vấn, truy vấn phải sử dụng các cột từ chỉ mục bắt đầu từ bên trái - không thể chỉ sử dụng phần thứ hai, thứ ba hoặc thứ tư của một chỉ mục, trừ khi nó cũng đang sử dụng các cột trước đó trong chỉ mục để khớp với các giá trị tĩnh. (Để chỉ mục FULLTEXT hữu ích cho truy vấn, truy vấn phải sử dụng tất cả các cột của chỉ mục.)


2
điều này có nghĩa là chỉ số FULLTEXT về cơ bản là vô dụng và không gian trống nếu bạn không sử dụng MATCH () / AGAINST () trong các truy vấn của mình?
dùng1397417

5
Đúng. Nó cũng chỉ được sử dụng cho cơ sở dữ liệu MyISAM trên MySQL, không phải InnoDB. Các máy chủ cơ sở dữ liệu khác có thể có các tính năng tương đương có thể hoạt động khác nhau.
thomasrutter

"không nên sử dụng nó trên bất kỳ cột nào cho phép giá trị NULL" -> Điều này sẽ là "không thể được sử dụng". Khóa chính là nhất thiết NOT NULL. MySQL sẽ báo cáo show columnsrằng khóa duy nhất không phải NULL là khóa chính, nếu không có khóa chính nào khác được xác định.
Gordon Linoff

1
Lý do ở đây là NULL được coi là không bằng chính nó .. Tôi sẽ không quên điều này
Hos Mercury

2
@thomasrutter MySQL hỗ trợ FULLTEXT trong InnoDB từ phiên bản 5.6
Marek Skiba

151

Tất cả đều là các loại chỉ số.

chính: phải là duy nhất, là một chỉ mục, là (có khả năng) là chỉ mục vật lý, có thể chỉ là một trên mỗi bảng.

độc đáo: như nó nói. Bạn không thể có nhiều hơn một hàng với một bộ giá trị này. Lưu ý rằng vì một khóa duy nhất có thể có nhiều hơn một cột, điều này không nhất thiết có nghĩa là mỗi cột riêng lẻ trong chỉ mục là duy nhất, nhưng mỗi tổ hợp giá trị trên các cột này là duy nhất.

index: nếu nó không phải là chính hay độc đáo, nó không giá trị Constrain chèn vào bảng, nhưng nó không cho phép họ được nhìn lên hiệu quả hơn.

fulltext: một hình thức lập chỉ mục chuyên biệt hơn cho phép tìm kiếm toàn văn. Hãy nghĩ về nó như (về cơ bản) tạo ra một "chỉ mục" cho mỗi "từ" trong cột được chỉ định.


32
Các khóa chính có thể là hỗn hợp, tức là đa khóa, trong MySQL (và nhiều DB khác). Chúng chỉ là một chỉ số đặc biệt. Unique không thực sự là một chỉ mục, đó là một ràng buộc (đòi hỏi một chỉ mục phải thực thi trong khoảng thời gian hợp lý, do đó tạo ra một chỉ mục).
MBCook

19

Tôi cảm thấy như điều này đã được bảo hiểm tốt, có thể ngoại trừ những điều sau đây:

  • Đơn giản KEY/ INDEX(hoặc được gọi khác SECONDARY INDEX) làm tăng hiệu suất nếu độ chọn lọc là đủ. Về vấn đề này, khuyến nghị thông thường là nếu số lượng bản ghi trong kết quả được đặt trên đó một chỉ mục được áp dụng vượt quá 20% tổng số lượng bản ghi của bảng cha, thì chỉ mục đó sẽ không hiệu quả. Trong thực tế mỗi kiến ​​trúc sẽ khác nhau, nhưng ý tưởng vẫn đúng.

  • Các chỉ mục phụ (và rất đặc trưng cho mysql) không nên được xem là các đối tượng hoàn toàn tách biệt và khác biệt với khóa chính. Trong thực tế, cả hai nên được sử dụng chung và, một khi thông tin này được biết, cung cấp một công cụ bổ sung cho mysBA DBA: trong Mysql, các chỉ mục nhúng khóa chính. Nó dẫn đến những cải tiến hiệu suất đáng kể, đặc biệt là khi khéo léo xây dựng các chỉ số bao phủ ngầm như được mô tả ở đó

  • Nếu bạn cảm thấy dữ liệu của mình phải như vậy UNIQUE, hãy sử dụng một chỉ mục duy nhất. Bạn có thể nghĩ rằng nó là tùy chọn (ví dụ: xử lý ở cấp ứng dụng) và một chỉ mục bình thường sẽ làm được, nhưng nó thực sự thể hiện sự đảm bảo cho Mysql rằng mỗi hàng là duy nhất, điều này mang lại lợi ích hiệu suất.

  • Bạn chỉ có thể sử dụng FULLTEXT(hoặc được gọi khác SEARCH INDEX) với Innodb (Trong MySQL 5.6.4 trở lên) và Myisam Engines

  • Bạn chỉ có thể sử dụng FULLTEXTtrên CHAR, VARCHARTEXTcác loại cột
  • FULLTEXTchỉ mục liên quan đến RẤT NHIỀU hơn là chỉ tạo ra một chỉ mục. Có một loạt các bảng hệ thống được tạo, một hệ thống bộ đệm hoàn toàn riêng biệt và một số quy tắc và tối ưu hóa cụ thể được áp dụng. Xem http://dev.mysql.com/doc/refman/5.7/en/fulltext-restrictions.htmlhttp://dev.mysql.com/doc/refman/5.7/en/innodb-fulltext-index.html
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.