Ràng buộc UNIQUE có tự động tạo INDEX trên (các) trường không?


97

Tôi có nên xác định một chỉ mục riêng biệt trên emailcột (cho mục đích tìm kiếm) hay chỉ mục được "tự động" thêm vào cùng với UNIQ_EMAIL_USERràng buộc?

CREATE TABLE IF NOT EXISTS `customer` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL,
  `first` varchar(255) NOT NULL,
  `last` varchar(255) NOT NULL,
  `slug` varchar(255) NOT NULL,
  `email` varchar(255) NOT NULL,
  `created_at` datetime NOT NULL,
  `updated_at` datetime NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `UNIQ_SLUG` (`slug`),
  UNIQUE KEY `UNIQ_EMAIL_USER` (`email`,`user_id`),
  KEY `IDX_USER` (`user_id`)
) ENGINE=InnoDB;

CHỈNH SỬA : theo đề xuất của Corbin tôi đã truy vấn EXPLAIN SELECT * FROM customer WHERE email = 'address'trên bàn trống. Đây là kết quả, tôi không biết phải giải thích nó như thế nào:

id select_type type possible_keys key  key_len ref  rows Extra
1  SIMPLE      ALL  NULL          NULL NULL    NULL 1    Using where

Trong khi thêm IXD_EMAIL vào bảng, cùng một truy vấn hiển thị:

id select_type type possible_keys key       key_len ref   rows Extra
1  SIMPLE      ref  IDX_EMAIL     IDX_EMAIL 257     const 1    Using where

1
Một ràng buộc UNIQUE về mặt kỹ thuật không yêu cầu một chỉ mục ... nhưng không chắc cách tiêu chuẩn định nghĩa nó hoặc MySQL (phần phụ trợ nào, btw?) Thực hiện nó. Tất cả những gì tôi có thể tìm thấy trong MySQL theo cách thủ công một cách nhanh chóng là "Một chỉ mục DUY NHẤT tạo ra một ràng buộc sao cho tất cả các giá trị trong chỉ mục phải khác biệt.".

Bạn cần triển khai & thử nghiệm với các chỉ mục riêng lẻ so với bao phủ (AKA composite - nhiều hơn một cột). Nó phụ thuộc vào việc sử dụng và dữ liệu.
OMG Ponies

3
Tôi chắc chắn 99% rằng nó thực sự tạo ra một chỉ mục. Chỉ cần tạo một bảng với một duy nhất, sau đó giải thích về một lựa chọn với một nơi.
Corbin

@Corbin đã làm được, tôi nên giải thích kết quả như thế nào?
gremo

Nó có sử dụng ràng buộc duy nhất làm chỉ mục không? Nhân tiện, bạn có thể cần sử dụng một bảng lớn đáng kể hoặc nó có thể chỉ thực hiện quét bảng.
Corbin

Câu trả lời:


115

Một khóa duy nhất là một trường hợp đặc biệt của chỉ số, hoạt động như một chỉ số thường xuyên với kiểm tra bổ sung cho tính độc đáo. Sử dụng, SHOW INDEXES FROM customerbạn có thể thấy các khóa duy nhất của mình trên thực tế là các chỉ mục loại B-cây.

Một chỉ số tổng hợp trên (email, user_id)là đủ, bạn không cần phải có chỉ mục riêng biệt trên chỉ email - MySQL có thể sử dụng phần tận cùng bên trái của một chỉ số tổng hợp. Có thể có một số trường hợp biên giới mà kích thước của một chỉ mục có thể làm chậm các truy vấn của bạn, nhưng bạn không nên lo lắng về chúng cho đến khi bạn thực sự gặp phải chúng.

Đối với việc kiểm tra việc sử dụng chỉ mục, trước tiên bạn nên điền vào bảng của mình một số dữ liệu để làm cho trình tối ưu hóa nghĩ rằng nó thực sự đáng để sử dụng chỉ mục đó.


Vì vậy, EXPLAINkiểm tra cho thấy các giá trị giả vì bảng trống?
gremo

Tôi không chắc bạn đã quản lý như thế nào để có được kết quả giải thích đó, tôi vừa sao chép định nghĩa bảng của bạn và phần giải thích tương tự hiển thị UNIQ_EMAIL_USER là khóa có thể, bạn có thể vui lòng kiểm tra lại không?
piotrm

Ok, đã tìm thấy thủ thuật. Khi ràng buộc được xác định bằng cách sử dụng user_idđầu tiên và sau đó emailnó không hiển thị trong EXPLAIN. Bạn có biết điều này?
gremo

10
Nó không hoạt động vì email không phải là phần ngoài cùng bên trái của cặp (user_id, email). Bạn không thể đi xuống cây b để tìm hàng của mình chỉ sử dụng phần ngoài cùng bên phải.
piotrm
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.