Nếu bạn muốn một chỉ mục được sử dụng và truy vấn không thực hiện quét bảng:
WHERE timestamp >= CURDATE()
AND timestamp < CURDATE() + INTERVAL 1 DAY
Để cho thấy sự khác biệt mà điều này tạo ra đối với các kế hoạch thực thi thực tế, chúng tôi sẽ kiểm tra bằng SQL-Fiddle (một trang web cực kỳ hữu ích):
CREATE TABLE test --- simple table
( id INT NOT NULL AUTO_INCREMENT
,`timestamp` datetime --- index timestamp
, data VARCHAR(100) NOT NULL
DEFAULT 'Sample data'
, PRIMARY KEY (id)
, INDEX t_IX (`timestamp`, id)
) ;
INSERT INTO test
(`timestamp`)
VALUES
('2013-02-08 00:01:12'),
--- --- insert about 7k rows
('2013-02-08 20:01:12') ;
Hãy thử 2 phiên bản ngay bây giờ.
Phiên bản 1 với DATE(timestamp) = ?
EXPLAIN
SELECT * FROM test
WHERE DATE(timestamp) = CURDATE() --- using DATE(timestamp)
ORDER BY timestamp ;
Giải thích:
ID SELECT_TYPE TABLE TYPE POSSIBLE_KEYS KEY KEY_LEN REF
1 SIMPLE test ALL
ROWS FILTERED EXTRA
6671 100 Using where; Using filesort
Nó lọc tất cả (6671) hàng và sau đó sắp xếp tệp (đó không phải là vấn đề vì các hàng trả về rất ít)
Phiên bản 2 với timestamp <= ? AND timestamp < ?
EXPLAIN
SELECT * FROM test
WHERE timestamp >= CURDATE()
AND timestamp < CURDATE() + INTERVAL 1 DAY
ORDER BY timestamp ;
Giải thích:
ID SELECT_TYPE TABLE TYPE POSSIBLE_KEYS KEY KEY_LEN REF
1 SIMPLE test range t_IX t_IX 9
ROWS FILTERED EXTRA
2 100 Using where
Nó sử dụng quét phạm vi trên chỉ mục , và sau đó chỉ đọc các hàng tương ứng từ bảng.