Có phải là một ý tưởng tốt để lập chỉ mục trường datetime trong mysql?


137

Tôi đang làm việc để thiết kế một cơ sở dữ liệu lớn. Trong ứng dụng của tôi, tôi sẽ có nhiều hàng, ví dụ tôi hiện có một bảng với 4 triệu bản ghi. Hầu hết các truy vấn của tôi sử dụng mệnh đề datetime để chọn dữ liệu. Có phải là một ý tưởng tốt để lập chỉ mục các trường datetime trong cơ sở dữ liệu mysql?

Select field1, field2,.....,field15
from table where field 20 between now() and now + 30 days 

Tôi đang cố gắng để giữ cho cơ sở dữ liệu của tôi hoạt động tốt và các truy vấn được chạy trơn tru

Hơn nữa, ý tưởng nào bạn nghĩ rằng tôi nên có để tạo ra một cơ sở dữ liệu hiệu quả cao?


Có gì field 20?
AlikElzin-kilaka

Câu trả lời:


164

MySQL khuyên bạn nên sử dụng các chỉ mục vì nhiều lý do bao gồm loại bỏ các hàng giữa các điều kiện: http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html

Điều này làm cho cột thời gian của bạn trở thành một ứng cử viên tuyệt vời cho một chỉ mục nếu bạn sẽ sử dụng nó trong điều kiện thường xuyên trong các truy vấn. Nếu điều kiện duy nhất của bạn là BETWEEN NOW() AND DATE_ADD(NOW(), INTERVAL 30 DAY)và bạn không có chỉ mục nào khác trong điều kiện, MySQL sẽ phải thực hiện quét toàn bộ bảng trên mỗi truy vấn. Tôi không chắc có bao nhiêu hàng được tạo trong 30 ngày, nhưng miễn là nó ít hơn khoảng 1/3 tổng số hàng thì sẽ hiệu quả hơn khi sử dụng một chỉ mục trên cột.

Câu hỏi của bạn về việc tạo ra một cơ sở dữ liệu hiệu quả là rất rộng. Tôi muốn nói rằng hãy đảm bảo rằng nó được chuẩn hóa và tất cả các cột thích hợp được lập chỉ mục (tức là các cột được sử dụng trong các phép nối và các mệnh đề).


3
Cám ơn vì đã giải thích. Điều đó thực sự có ích. Tôi chắc chắn tôi sẽ có nhiều bộ lọc hơn cho nó. Tôi chỉ muốn đảm bảo lập chỉ mục trường datetime là một ý tưởng tốt hay không vì chúng ta có thể có thời gian ngày trùng lặp. nhưng bạn câu trả lời giải thích nó :) Cảm ơn bạn
Jaylen

4
+1 cho 'những cái được sử dụng trong các phép nối và các mệnh đề'. Một quy tắc tuyệt vời cho một chiến lược lập chỉ mục. Rõ ràng bây giờ tôi nghĩ về nó, nhưng đã không xảy ra với tôi trước đây
Gaz_Edge

1
Nhưng nếu bạn truy vấn dữ liệu với phạm vi ngày , chẳng hạn như phạm vi dữ liệu từ "2017-01-01 11:20" đến "2018-01-03 12:12", thì nó không giúp SELECTtruy vấn nhanh hơn mặc dù tôi đã lập chỉ mục date timecột. .. chỉ mục thực hiện truy vấn nhanh khi tôi sử dụng equalthao tác .. Tôi có đúng không?
dùng3595632

1
Làm thế nào về nếu truy vấn các trường datetime với các hàm thời gian như DAY (datetime) hoặc HOUR (datetime). Chỉ số sẽ giúp hoặc cản trở trong trường hợp này?
cronoklee

hi @Explumping Pills, nếu tôi chỉ cần truy vấn cơ sở bảng theo năm và tháng, tôi sẽ có hiệu suất tốt hơn nếu tôi tạo một cột mới chỉ với năm và tháng sau đó lập chỉ mục cho nó, thay vì trực tiếp tạo chỉ mục của cột thời gian ? Chẳng hạn như tôi tạo một cột có giá trị như năm 201801.
Woods Chen

18

Ở đây tác giả đã thực hiện các thử nghiệm cho thấy rằng dấu thời gian unix số nguyên tốt hơn DateTime. Lưu ý, anh ấy đã sử dụng MySql. Nhưng tôi cảm thấy không có vấn đề gì với công cụ DB mà bạn sử dụng so sánh các số nguyên nhanh hơn một chút so với so sánh ngày để chỉ số int tốt hơn chỉ số DateTime. Lấy T1 - thời gian so sánh 2 ngày, T2 - thời gian so sánh 2 số nguyên. Tìm kiếm trên trường được lập chỉ mục mất khoảng thời gian O (log (hàng)) vì chỉ mục dựa trên một số cây cân bằng - nó có thể khác nhau đối với các công cụ DB khác nhau nhưng dù sao thì Log (hàng) là ước tính chung. (nếu bạn không sử dụng chỉ số dựa trên bitmask hoặc r-tree). Vì vậy, sự khác biệt là (T2-T1) * Nhật ký (hàng) - có thể đóng vai trò nếu bạn thực hiện truy vấn của mình thường xuyên.


Cảm ơn bạn. Tôi đã suy nghĩ về điều đó như là một lựa chọn nhưng không biết làm thế nào để tiếp cận nó. Tôi tin rằng bạn là số nguyên hoàn toàn đúng luôn luôn nhanh hơn.
Jaylen

62
Tốt hơn? Tôi nghi ngờ một dấu thời gian unix là tốt hơn cho tất cả các trường hợp. Đúng, lưu trữ một số nguyên thường nhanh hơn lưu trữ một chuỗi, nhưng còn tất cả các chức năng DateTime mà MySQL trưng ra thì sao? Tự mình thực hiện chúng sẽ có tác động tiêu cực đến hiệu suất hoặc chức năng.
Greg
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.