Để nhận các mục nhập trong một tháng cụ thể, trong một năm cụ thể, nhanh hơn - bạn sẽ cần lập chỉ mục time
cột
:
CREATE INDEX idx_time ON ENTRIES(time) USING BTREE;
Ngoài ra, hãy sử dụng:
SELECT e.*
FROM ENTRIES e
WHERE e.time BETWEEN '2010-04-01' AND DATE_SUB('2010-05-01' INTERVAL 1 SECOND)
... bởi vì BETWEEN là bao gồm, vì vậy bạn sẽ nhận được bất kỳ thứ gì có ngày "2010-05-01 00:00:00" với truy vấn bạn đã đăng.
Tôi cũng muốn chọn dữ liệu từ tháng nhất định từ một DataSourceID nhất định
Bạn có thể thêm một chỉ mục riêng cho cột datasourceid:
CREATE INDEX idx_time ON ENTRIES(datasourceid) USING BTREE;
... hoặc thiết lập một chỉ mục bao trùm để bao gồm cả hai cột:
CREATE INDEX idx_time ON ENTRIES(time, datasourceid) USING BTREE;
Chỉ mục bao trùm yêu cầu rằng các cột ngoài cùng bên trái phải được sử dụng trong truy vấn để chỉ mục được sử dụng. Trong ví dụ này, có time
đầu tiên sẽ hoạt động cho cả hai trường hợp bạn đã đề cập - datasourceid không cần phải được sử dụng để chỉ mục được sử dụng. Tuy nhiên, bạn phải kiểm tra các truy vấn của mình bằng cách xem đầu ra GIẢI THÍCH để thực sự biết điều gì hoạt động tốt nhất cho dữ liệu của bạn và các truy vấn đang được thực hiện trên dữ liệu đó.
Điều đó nói rằng, các chỉ mục sẽ làm chậm các câu lệnh INSERT, UPDATE và DELETE. Và một chỉ mục không cung cấp nhiều giá trị nếu dữ liệu cột có ít giá trị khác biệt - IE:cột boolean là một lựa chọn tồi để lập chỉ mục, vì bản số thấp.