Nếu dữ liệu của bạn là duy nhất, bạn nên tạo UNIQUE
lập chỉ mục về chúng.
Điều này ngụ ý không có thêm chi phí và ảnh hưởng đến quyết định của trình tối ưu hóa trong một số trường hợp nhất định để nó có thể chọn một thuật toán tốt hơn.
Trong SQL Server
và trong PostgreSQL
, chẳng hạn, nếu bạn sắp xếp trên UNIQUE
, trình tối ưu hóa bỏ qua ORDER BY
mệnh đề được sử dụng sau đó (vì chúng không liên quan), i. e. truy vấn này:
SELECT *
FROM mytable
ORDER BY
col_unique, other_col
LIMIT 10
sẽ sử dụng một chỉ mục trên col_unique
và sẽ không sắp xếp trên other_col
bởi vì nó vô dụng.
Truy vấn này:
SELECT *
FROM mytable
WHERE mycol IN
(
SELECT othercol
FROM othertable
)
cũng sẽ được chuyển đổi thành INNER JOIN
(trái ngược với SEMI JOIN
) nếu có UNIQUE
lập chỉ mục trên othertable.othercol
.
Chỉ mục luôn chứa một số loại con trỏ đến hàng (ctid
trong PostgreSQL
, con trỏ hàng trong MyISAM
, khóa chính / bộ duy nhất trong InnoDB
) và các lá được sắp xếp theo thứ tự trên các con trỏ này, vì vậy trên thực tế, mọi lá chỉ mục đều là duy nhất theo một cách nào đó (mặc dù nó có thể không rõ ràng).
Xem bài viết này trong blog của tôi để biết chi tiết về hiệu suất: