2013-06-14 21 views
9

Tôi chỉ tìm mysql có thể truy vấn datetime sử dụng như:mysql lĩnh vực datetime với chỉ số có được một phạm vi 'như' vs 'giữa và' hiệu suất

like '2013-06-12%' 

tôi nghĩ rằng nó không thể sử dụng các chỉ số. Tôi Google nó, nhưng không thể tìm thấy chủ đề như vậy trực tiếp. Vì vậy, tôi có một bài kiểm tra bằng cách sử dụng một bảng với 3308614 hồ sơ. Câu lệnh SQL đầu tiên:

SELECT * FROM subscription t WHERE DATE(t.active_time) = '2013-06-30'; 

Tất cả chúng ta biết SQL này không thể sử dụng chỉ mục và mất 4 giây để có kết quả. Câu lệnh SQL thứ hai:

SELECT * FROM subscription t WHERE t.active_time LIKE '2013-06-30%'; 

Tôi không biết nếu nó có thể sử dụng chỉ mục, nhưng cũng mất 4 giây. Câu lệnh SQL thứ ba:

SELECT * FROM subscription t WHERE t.active_time > '2007-11-30' AND t.active_time < '2007-12-01'; 

Tất cả chúng ta biết SQL thứ ba có thể sử dụng chỉ mục và phải mất 0,016 giây. Vì vậy, tôi nghĩ 'like' không thể sử dụng chỉ mục khi truy vấn trường datetime, bởi vì mysql nên chuyển đổi trường datetime thành chuỗi đầu tiên và gửi chuỗi giống như lệnh. Điều này có đúng không?

+0

"Điều này có đúng không?" --- yep – zerkms

+0

bạn có thể truy vấn ngày và như thế này 't.active_time = '2013-06-30'' – Justin

+0

KHÔNG thể sử dụng t.active_time =' 2013-06-30 '!! – bluearrow

Trả lời

13

Giả sử rằng loại t.active_time 's là DATETIME,

Các truy vấn sau đây không thể sử dụng một chỉ số vì gọi hàm. Tất cả active_time phải được chuyển đổi trực tiếp thành giá trị DATE trước khi so sánh với '2013-06-30'. Chuỗi này được chuyển thành giá trị DATE ở vị trí đầu tiên và điều này chỉ xảy ra một lần ngay từ đầu truy vấn.

SELECT * FROM subscription t WHERE DATE(t.active_time) = '2013-06-30'; 

Truy vấn thứ hai không thể sử dụng chỉ mục vì lý do tương tự. Bạn đang thực sự so sánh chuỗi (vì nhà điều hành LIKE). Tất cả các giá trị active_time được chuyển đổi thành chuỗi khi đang di chuyển.

SELECT * FROM subscription t WHERE t.active_time LIKE '2013-06-30%'; 

Chỉ người cuối cùng mới có thể sử dụng chỉ mục. Các chuỗi '2007-11-30''2007-12-01' được truyền tới DATETIME trong trường hợp này, bởi vì các toán tử <> cho phép điều này.

SELECT * FROM subscription t WHERE t.active_time > '2007-11-30' AND t.active_time < '2007-12-01'; 

Loại thứ hai cũng áp dụng cho các nhà khai thác =BETWEEN.

Để biết thông tin, tất cả các loại có thể được so sánh với một chuỗi với toán tử LIKE, bị cùng một vấn đề như được mô tả ở trên, do chuyển đổi tiềm ẩn mà nó yêu cầu.

t.active_time = '2013-06-30' không hoạt động như mong đợi vì '2013-06-30' được truyền tới giá trị DATETIME, tức là '2013-06-30 00:00:00'.

1

Một thay thế cho trường hợp này là để làm một cái gì đó như thế này:

SELECT * 
FROM subscription t 
WHERE t.active_time BETWEEN '2013-06-30 00:00:00' AND '2013-06-30 23:59:59'; 

Trong khi kết thúc bạn sẽ có được tất cả các sự kiện từ ngày hôm đó.

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