Dựa trên thông số kỹ thuật không đầy đủ, tôi sẽ làm điều này:
CREATE UNIQUE INDEX stock_UX1 ON stock (storeid,seedid,stk)
Chỉ mục này sẽ đáp ứng yêu cầu đối với chỉ mục có storeid
làm cột hàng đầu. (Và chúng tôi biết sẽ có yêu cầu đó nếu đây là InnoDB và storeid
là một khóa ngoại.)
Với một hàng bảng ngắn như vậy, tôi sẽ tiếp tục và biến nó thành một chỉ mục bao trùm và bao gồm tất cả các cột. Sau đó, các truy vấn có thể được đáp ứng trực tiếp từ các trang chỉ mục mà không cần tra cứu đến các trang dữ liệu trong bảng bên dưới.
Vì chúng tôi biết rằng (seedid,storeid)
là duy nhất (được cho là KHÓA CHÍNH), chúng tôi biết (storeid,seedid)
cũng là duy nhất, vì vậy chúng tôi cũng có thể khai báo chỉ mục là DUY NHẤT.
Có những sự lựa chọn khác; chúng ta không phải tạo chỉ mục đó ở trên. Thay vào đó, chúng tôi chỉ có thể làm điều này:
CREATE INDEX stock_IX2 ON stock (storeid)
Nhưng điều đó sẽ sử dụng gần như cùng một lượng không gian và không có lợi cho nhiều truy vấn nhất có thể.
Chỉ mục phụ sẽ chứa khóa chính của bảng; để chỉ mục thứ hai sẽ bao gồm seedid
, được cung cấp TỪ KHÓA CHÍNH của bảng. Tức là, chỉ số tương đương với cái này:
CREATE INDEX stock_IX3 ON stock (storeid,seedid)
Và chúng tôi biết sự kết hợp của hai cột đó là duy nhất, vì vậy chúng tôi có thể bao gồm từ khóa DUY NHẤT
CREATE UNIQUE INDEX stock_UX4 ON stock (storeid,seedid)
Nếu chúng tôi GIẢI THÍCH về một truy vấn của biểu mẫu
EXPLAIN
SELECT t.storeid
, t.seedid
, t.stk
FROM stock t
WHERE t.storeid = 'foo'
chúng ta có thể thấy thao tác quét phạm vi trên chỉ mục phụ; nhưng truy xuất giá trị của stk
cột sẽ yêu cầu tra cứu các trang dữ liệu trong bảng bên dưới. Bao gồm stk
trong chỉ mục phụ sẽ làm cho chỉ mục trở thành bao trùm chỉ mục cho truy vấn. Với chỉ mục được đề xuất đầu tiên trong câu trả lời, chúng tôi mong đợi EXPLAIN
đầu ra để hiển thị "Sử dụng chỉ mục".