Để sử dụng các chỉ số cho tất cả các điều kiện bình đẳng càng tốt trên N
cột, bạn sẽ cần C([N/2], N)
chỉ số, đó là N!/([N/2]! * (N - [N/2])!)
Xem bài viết này trong blog của tôi để giải thích chi tiết:
Bạn cũng có thể đọc các chặt chẽ toán học proof bởi Nga toán học Egor Timoshenko
(update: bây giờ trong tiếng Anh).
ai có thể, tuy nhiên, có được hiệu suất đàng hoàng với chỉ số ít sử dụng các kỹ thuật sau:
Index sáp nhập
Nếu các cột col1
, col2
và col3
là chọn lọc, sau đó truy vấn này
SELECT *
FROM mytable
WHERE col1 = :value1
AND col2 = :value2
AND col3 = :value3
có thể sử dụng ba chỉ mục riêng biệt trên col1
, col2
và col3
, chọn 's ROWID
phù hợp với từng điều kiện riêng biệt và họ tìm ngã tư của họ, như trong:
SELECT *
FROM (
SELECT rowid
FROM mytable
WHERE col1 = :value1
INTERSECT
SELECT rowid
FROM mytable
WHERE col2 = :value2
INTERSECT
SELECT rowid
FROM mytable
WHERE col3 = :value3
) mo
JOIN mytable mi
ON mi.rowid = mo.rowid
Bitmap indexing
PostgreSQL
có thể xây dựng các chỉ số bitmap tạm thời trong bộ nhớ ngay trong truy vấn.
Chỉ mục bitmap là một mảng bit liền kề nhỏ gọn.
Mỗi bit được đặt cho mảng cho biết rằng việc sửa lỗi tid
phải được chọn từ bảng.
Chỉ mục như vậy có thể mất nhưng 128M
lưu trữ tạm thời cho một bảng có 1G
hàng.
Các truy vấn sau đây:
SELECT *
FROM mytable
WHERE col1 = :value1
AND col2 = :value2
AND col3 = :value3
đầu tiên sẽ phân bổ một bitmap zero-điền đủ lớn để trang trải tất cả các khả năng tid
's trong bảng (có nghĩa là đủ lớn để thực hiện tất cả tid
' s từ (0, 0)
đến cuối cùng, không bị mất tích tid
vào tài khoản).
Sau đó, nó sẽ tìm kiếm chỉ mục đầu tiên, thiết lập các bit thành 1
nếu chúng thỏa mãn điều kiện đầu tiên.
Sau đó, nó sẽ quét chỉ mục thứ hai, AND
'ing các bit thỏa mãn điều kiện thứ hai với 1
. Điều này sẽ để lại 1
chỉ cho những bit thỏa mãn cả hai điều kiện.
Tương tự cho chỉ mục thứ ba.
Cuối cùng, nó sẽ chỉ chọn các hàng tương ứng với các bit của tid
.
Số tid
sẽ được tìm nạp liên tục, vì vậy nó rất hiệu quả.
Đây là câu trả lời đúng. MySQL hoạt động theo cùng một cách, và kỹ thuật này được gọi là "Tiền tố tận cùng bên trái". Từ hướng dẫn sử dụng MySQL tại http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html: "Nếu bảng có chỉ mục nhiều cột, thì bất kỳ tiền tố ngoài cùng nào của chỉ mục có thể được sử dụng bởi Ví dụ, nếu bạn có chỉ mục ba cột trên (col1, col2, col3), bạn đã lập chỉ mục các khả năng tìm kiếm trên (col1), (col1, col2) và (col1, col2, col3) " – zombat
Hmm, tôi nên biết điều này. ;) Rất tuyệt vời, tôi sẽ thực hiện cú đánh này. –
Bạn cũng có thể cần một, c, nhưng nó phụ thuộc vào các truy vấn của bạn trông như thế nào.Bạn cũng có thể cần chỉ mục riêng lẻ để bao gồm kịch bản OR được đề cập bởi Andriyev, không chắc chắn. –