Tôi có một bảng "đơn hàng" với trường "Thời gian", chứa dấu thời gian unix [độ phân giải giây] của mỗi đơn hàng. Trường này được lập chỉ mục
Trong Trình tạo mô hình cơ sở dữ liệu, tôi đã đặt loại trường thành “Dấu thời gian Unix [giây]”, để Trình tạo truy vấn nhận ra đó là ngày và cho phép tôi chọn khoảng thời gian ngày làm bộ lọc
Tuy nhiên, như tôi đã phát hiện ra, bộ lọc như vậy không may được dịch thành biểu thức "ở đâu" sau đây
Các chỉ mục được sử dụng để truy xuất dữ liệu từ cơ sở dữ liệu nhanh hơn so với cách khác. Người dùng không thể nhìn thấy các chỉ mục, chúng chỉ được sử dụng để tăng tốc độ tìm kiếm/truy vấn
Ghi chú. Cập nhật bảng có chỉ mục mất nhiều thời gian hơn cập nhật bảng không có chỉ mục [vì chỉ mục cũng cần cập nhật]. Vì vậy, chỉ tạo các chỉ mục trên các cột sẽ được tìm kiếm thường xuyên
Cú pháp TẠO CHỈ SỐ
Tạo một chỉ mục trên một bảng. Các giá trị trùng lặp được cho phép
TẠO INDEX index_name
TRÊN tên_bảng [cột1, cột2,. ];
TẠO CHỈ SỐ DUY NHẤT Cú pháp
Tạo một chỉ mục duy nhất trên một bảng. Giá trị trùng lặp không được phép
TẠO INDEX DUY NHẤT index_name
TRÊN tên_bảng [cột1, cột2,. ];
MySQL CREATE INDEX Ví dụ
Câu lệnh SQL dưới đây tạo một chỉ mục có tên "idx_lastname" trên cột "LastName" trong bảng "Persons"
TẠO CHỈ SỐ idx_lastname
ON Người [Họ];
Nếu bạn muốn tạo chỉ mục trên tổ hợp cột, bạn có thể liệt kê tên cột trong dấu ngoặc đơn, phân tách bằng dấu phẩy
Nhiều bảng cơ sở dữ liệu trong thế giới thực có nhiều hàng với các giá trị cột DATETIME
HOẶC TIMESTAMP
kéo dài rất nhiều thời gian, bao gồm nhiều năm hoặc thậm chí nhiều thập kỷ. Thông thường, cần sử dụng mệnh đề WHERE
để truy xuất một số tập hợp con của khoảng thời gian đó. Ví dụ: chúng tôi có thể muốn truy xuất các hàng cho ngày 1 tháng 9 năm 2016 từ một bảng
Một cách không hiệu quả để làm điều đó là điều này
WHERE DATE[x] = '2016-09-01' /* slow! */
Nó không hiệu quả vì nó áp dụng một hàm -- DATE[]
-- cho các giá trị của một cột. Điều đó có nghĩa là MySQL phải kiểm tra từng giá trị của x
và không thể sử dụng chỉ mục
Một cách tốt hơn để thực hiện thao tác này là
WHERE x >= '2016-09-01'
AND x < '2016-09-01' + INTERVAL 1 DAY
Điều này chọn một loạt các giá trị của x
nằm ở bất kỳ đâu trong ngày được đề cập, cho đến nhưng không bao gồm [do đó = '2016-09-01'
AND x < '2016-09-01' + INTERVAL 1 DAY
1
Đừng bị cám dỗ để sử dụng cái này, mặc dù nó có vẻ hiệu quả hơn
WHERE x BETWEEN '2016-09-01' AND '2016-09-01' + INTERVAL 1 DAY /* wrong! */
Nó có hiệu quả tương tự như quét phạm vi, nhưng nó sẽ chọn các hàng có giá trị x
rơi chính xác vào nửa đêm ngày 2 tháng 9 năm 2016, đây không phải là điều bạn muốn