2010-11-20 46 views
8

này là cơ bản cấu trúc ngày-thời gian của tôi:Làm thế nào để tối ưu hóa tìm kiếm thời gian ngày trong Mysql?

primary key(datetime)   key 
auot_id date_time    user_id 
1  2010-10-01 20:32:34 1 
2  2010-10-02 20:32:34 1 
3  2010-11-03 20:32:34 2 
4  2010-10-04 20:32:34 1 
5  2010-11-05 20:32:34 1 

Và tôi muốn để có được kết quả của day(date_time) tại '2010-10'user_id = '1'; SQL của tôi là:

SELECT * FROM datetime WHERE user_id = 1 AND DATE_FORMAT(date,'%Y-%m') = '2010-10' 

nhưng màn hình hiển thị EXPLAIN đang :

SIMPLE datetime ALL (NULL) (NULL) (NULL) (NULL) 5 Using where 

vì vậy, dòng mã này dường như không có vẻ rất hiệu quả。Tôi làm cách nào để xây dựng bảng để làm cho tìm kiếm của tôi hiệu quả hơn ??

Cảm ơn bạn rất nhiều !!

Trả lời

12

Sử dụng hàm trên cột trong mệnh đề WHERE ngăn việc sử dụng hiệu quả chỉ mục trên cột đó. Hãy thử thay vào đó:

SELECT * 
FROM `datetime` 
WHERE user_id = 1 
AND `date` >= '2010-10-01' AND `date` < '2010-11-01' 

Thêm chỉ mục trên (user_id, date).

+1

Tôi mới sử dụng mysql. Vì vậy, tôi không chắc chắn về loại chỉ mục nào tôi nên thêm vào? Tôi nghĩ rằng tôi đã lập chỉ mục trên chúng: INDEX 'date' (' date', 'user_id') – qinHaiXiang

+0

Bạn muốn nó theo cách khác xung quanh' user_id' là một giá trị "tĩnh", khi 'date' được chuyển đến một hàm . – Danosaure

+0

Xem https://dba.stackexchange.com/a/140693/39319 nơi người dùng giải thích tốt hơn cách bao gồm tất cả các khoảng thời gian và ngày nếu bạn lo ngại về giao dịch nửa đêm –

2
SELECT * 
FROM yourTable 
WHERE datatime 
BETWEEN '2010-10-01' AND '2010-11-01' 

hiệu quả và chấp nhận lập chỉ mục quá.

0

Làm thế nào về:

WHERE CAST(datatime AS DATE) = '2010-10-01' 

Hoặc có lẽ

WHERE CAST(datatime AS DATE) = CAST('2010-10-01' AS DATE) 

rằng sẽ là quá kém hiệu quả?

+1

Điều này chỉ giống như DATE (datatime), trong đó hiệu lực vô hiệu hóa chỉ mục –

Các vấn đề liên quan