2008-11-20 27 views

Trả lời

157

Có, nhưng chỉ trên Innodb. Innodb là định dạng bảng hiện được vận chuyển duy nhất có khóa ngoại được triển khai

+0

Bạn có lý do nào để tin rằng MySQL sẽ không bao giờ cho phép các phím nước ngoài trên các cột không được lập chỉ mục cho bất kỳ loại bảng nào khác? –

+0

Tôi thực sự không thể trả lời. Bạn có thể muốn tìm kiếm các công cụ lưu trữ của Maria và Falcon sẽ được phát hành trong MySQL 6.0 và xem chúng có hỗ trợ khóa ngoài trên các cột không được lập chỉ mục hay không. –

+0

Rõ ràng điều này không đúng. Tôi có một bảng lớn (1 triệu bản ghi) và đếm (*) trong đó fkey =? sẽ mất 15 giây. Đã thêm một chỉ mục trên cột fkey và mọi thứ sẽ diễn ra sau một giây. – AbiusX

90

Dường như chỉ mục được tạo tự động như được chỉ định trong the link robert has posted.

InnoDB requires indexes on foreign keys and referenced keys so that foreign key checks can be fast and not require a table scan. In the referencing table, there must be an index where the foreign key columns are listed as the first columns in the same order. Such an index is created on the referencing table automatically if it does not exist. (This is in contrast to some older versions, in which indexes had to be created explicitly or the creation of foreign key constraints would fail.) index_name, if given, is used as described previously.

InnoDB and FOREIGN KEY Constraints

+6

+1 câu trả lời hay hơn so với câu trả lời được cung cấp dưới dạng tài liệu –

+4

Văn bản được trích dẫn dường như không được bao gồm trong tài liệu MySQL nữa, làm cho nó không rõ ràng nếu điều này vẫn đúng hay không. – user2045006

+5

@ user2045006 bạn có thể tham khảo [doc 5.0] (http://dev.mysql.com/doc/refman/5.0/vi/create-table-foreign-keys.html) [doc 5.6] (http://dev.mysql.com/doc/refman/5.6/en/create-table-foreign-keys.html) cho văn bản được trích dẫn chính xác – sactiw

4

Như đã trình bày nó cho InnoDB. Lúc đầu, tôi nghĩ rằng nó là lạ mà nhiều người khác (đặc biệt là MS SQL và DB2) không. Quét bảng không gian chỉ tốt hơn quét chỉ mục khi có rất ít hàng trong bảng - vì vậy đối với phần lớn các trường hợp, khóa ngoại sẽ được lập chỉ mục. Sau đó, nó loại đánh tôi - điều này không nhất thiết có nghĩa là nó phải là một đứng một mình (một cột) chỉ số - nơi nó nằm trong chỉ số FK tự động của MySQL. Vì vậy, có thể đó là lý do MS SQL, DB2 (Oracle tôi không chắc chắn về), vv để nó lên đến DBA; sau khi tất cả nhiều chỉ mục trên các bảng lớn có thể gây ra các vấn đề về hiệu suất và không gian.

9

Bạn không nhận được chỉ số tự động nếu bạn làm một TABLE ALTER (thay vì CREATE TABLE), ít nhất là theo the docs (liên kết là dành cho 5.1 nhưng đó là tương tự cho 5.5):

[...] When you add a foreign key constraint to a table using ALTER TABLE, remember to create the required indexes first.

+9

Tôi đã thử trên _5.5.31_ và 'ALTER TABLE' đã tạo một chỉ mục. –

+2

Tôi cũng đã thử trên MySQL 5.6 và MariaDB 10 và ALTER TABLE đã chỉ ra một chỉ mục. Thật thú vị khi mysqlindexcheck báo cáo rằng chỉ mục đó là "chỉ số dư thừa". Tôi đã cố gắng để thả nó nhưng tôi đã nhận lỗi sau: "ERROR 1553 (HY000): Không thể thả chỉ mục 'index_name': cần thiết trong một ràng buộc khóa ngoại". Vì vậy, không thể bỏ chỉ mục đó và giữ khóa ngoại. –

2

Có, Innodb cung cấp điều này. Bạn có thể đặt một tên khóa ngoài sau mệnh đề FOREIGN KEY hoặc để nó để cho phép MySQL tạo tên cho bạn. MySQL tự động tạo chỉ mục có tên foreign_key_name.

CONSTRAINT constraint_name 
FOREIGN KEY foreign_key_name (columns) 
REFERENCES parent_table(columns) 
ON DELETE action 
ON UPDATE action 
-2

Nó không thể để có được chìa khóa chỉ số tự động sử dụng

ALTER TABLE (NAME OF THE TABLE) ADD INDEX (FOREIGN KEY) 

Tên của bảng mà bạn đã tạo ra ví dụ ảnh chụp và KEY NƯỚC NGOÀI ví dụ photograph_id. Mã nên được như thế này

ALTER TABLE photographs ADD INDEX (photograph_id); 
3

Đối với những người đang tìm kiếm trích dẫn từ 5.7docs:

MySQL requires indexes on foreign keys and referenced keys so that foreign key checks can be fast and not require a table scan. In the referencing table, there must be an index where the foreign key columns are listed as the first columns in the same order. Such an index is created on the referencing table automatically if it does not exist. This index might be silently dropped later, if you create another index that can be used to enforce the foreign key constraint. index_name, if given, is used as described previously.

Các vấn đề liên quan