Chúng tôi có truy vấn tìm kiếm các bản sao trong một trong các bảng của chúng tôi, dựa trên số nhận dạng hiếm khi có sẵn, hãy gọi số rareIdentifier INT(10) UNSIGNED NULL
. Chúng tôi có một chỉ mục cũ thông thường trên cột này.MariaDB không sử dụng chỉ mục trên 1 cột tự tham gia do chọn lọc thấp (tất cả các NULL)
Các truy vấn trong câu hỏi như sau:
SELECT a.id, b.id FROM
widget a INNER JOIN widget b
ON a.rareIdentifier = b.rareIdentifier;
Vấn đề là cho một hoạt động trùng lặp tìm hiểu gần đây, chúng tôi thực sự có 0
hàng với giá trị cho rareIdentifier
; tức là tất cả các hàng có NULL
cho cột này. MariaDB đã quyết định không sử dụng chỉ mục, chọn cách tiếp cận Using join buffer (flat, BNL join)
đã quét toàn bộ bảng.
Nhưng NULL
s không thể bằng nhau! Vậy tại sao nó lại cố so sánh từng cặp hàng?
Tôi hiểu rằng MySQL/MariaDB sẽ không sử dụng chỉ mục nếu chọn lọc của nó quá thấp. Tôi tin rằng đây là trường hợp ở đây. Trong thực tế, có vẻ như chỉ có 1 giá trị trong chỉ mục có nghĩa là truy vấn là khá nhiều tức thì.
Bảng này là bảng InnoDB.
Chỉ mục hiện tại của bạn trên bảng đó là gì? – Shawn