Chỉ mục dấu thời gian của MySQL

Tôi có một bảng "đơn hàng" với trường "Thời gian", chứa dấu thời gian unix (độ phân giải giây) của mỗi đơn hàng. Trường này được lập chỉ mục

Trong Trình tạo mô hình cơ sở dữ liệu, tôi đã đặt loại trường thành “Dấu thời gian Unix (giây)”, để Trình tạo truy vấn nhận ra đó là ngày và cho phép tôi chọn khoảng thời gian ngày làm bộ lọc

Tuy nhiên, như tôi đã phát hiện ra, bộ lọc như vậy không may được dịch thành biểu thức "ở đâu" sau đây

Các chỉ mục được sử dụng để truy xuất dữ liệu từ cơ sở dữ liệu nhanh hơn so với cách khác. Người dùng không thể nhìn thấy các chỉ mục, chúng chỉ được sử dụng để tăng tốc độ tìm kiếm/truy vấn

Ghi chú. Cập nhật bảng có chỉ mục mất nhiều thời gian hơn cập nhật bảng không có chỉ mục (vì chỉ mục cũng cần cập nhật). Vì vậy, chỉ tạo các chỉ mục trên các cột sẽ được tìm kiếm thường xuyên

Cú pháp TẠO CHỈ SỐ

Tạo một chỉ mục trên một bảng. Các giá trị trùng lặp được cho phép

TẠO INDEX index_name
TRÊN tên_bảng (cột1, cột2,. );

TẠO CHỈ SỐ DUY NHẤT Cú pháp

Tạo một chỉ mục duy nhất trên một bảng. Giá trị trùng lặp không được phép

TẠO INDEX DUY NHẤT index_name
TRÊN tên_bảng (cột1, cột2,. );


MySQL CREATE INDEX Ví dụ

Câu lệnh SQL dưới đây tạo một chỉ mục có tên "idx_lastname" trên cột "LastName" trong bảng "Persons"

TẠO CHỈ SỐ idx_lastname
ON Người (Họ);

Nếu bạn muốn tạo chỉ mục trên tổ hợp cột, bạn có thể liệt kê tên cột trong dấu ngoặc đơn, phân tách bằng dấu phẩy

Nhiều bảng cơ sở dữ liệu trong thế giới thực có nhiều hàng với các giá trị cột DATETIME HOẶC TIMESTAMP kéo dài rất nhiều thời gian, bao gồm nhiều năm hoặc thậm chí nhiều thập kỷ. Thông thường, cần sử dụng mệnh đề WHERE để truy xuất một số tập hợp con của khoảng thời gian đó. Ví dụ: chúng tôi có thể muốn truy xuất các hàng cho ngày 1 tháng 9 năm 2016 từ một bảng

Một cách không hiệu quả để làm điều đó là điều này

 WHERE DATE(x) = '2016-09-01'   /* slow! */

Nó không hiệu quả vì nó áp dụng một hàm -- DATE() -- cho các giá trị của một cột. Điều đó có nghĩa là MySQL phải kiểm tra từng giá trị của x và không thể sử dụng chỉ mục

Một cách tốt hơn để thực hiện thao tác này là

 WHERE x >= '2016-09-01'
   AND x <  '2016-09-01' + INTERVAL 1 DAY

Điều này chọn một loạt các giá trị của x nằm ở bất kỳ đâu trong ngày được đề cập, cho đến nhưng không bao gồm (do đó <) nửa đêm ngày hôm sau

Nếu bảng có chỉ mục trên cột x, thì máy chủ cơ sở dữ liệu có thể thực hiện quét phạm vi trên chỉ mục. Điều đó có nghĩa là nó có thể nhanh chóng tìm thấy giá trị phù hợp đầu tiên của x, sau đó quét chỉ mục một cách tuần tự cho đến khi tìm thấy giá trị phù hợp cuối cùng. Quét phạm vi chỉ mục hiệu quả hơn nhiều so với quét toàn bộ bảng theo yêu cầu của

 WHERE x >= '2016-09-01'
   AND x <  '2016-09-01' + INTERVAL 1 DAY
1

Đừng bị cám dỗ để sử dụng cái này, mặc dù nó có vẻ hiệu quả hơn

  WHERE x BETWEEN '2016-09-01' AND '2016-09-01' + INTERVAL 1 DAY  /*  wrong! */

Nó có hiệu quả tương tự như quét phạm vi, nhưng nó sẽ chọn các hàng có giá trị x rơi chính xác vào nửa đêm ngày 2 tháng 9 năm 2016, đây không phải là điều bạn muốn

Dấu thời gian có thể được lập chỉ mục không?

Đúng, việc lập chỉ mục các cột dấu thời gian khi bạn truy vấn chúng là hoàn toàn nên làm và bình thường. Tôi lập chỉ mục dấu thời gian của mình khi tôi biết mình sẽ thường xuyên truy vấn/sắp xếp theo cột đó.

Làm cách nào để sử dụng dấu thời gian trong MySQL?

Khi bảng MySQL được tạo, chỉ cần làm điều này. .
chọn DẤU THỜI GIAN làm loại cột của bạn
đặt giá trị Mặc định thành CURRENT_TIMESTAMP
sau đó chỉ cần chèn bất kỳ hàng nào vào bảng mà không cần chèn bất kỳ giá trị nào cho cột thời gian

Dấu thời gian được lưu trữ trong MySQL như thế nào?

MySQL chuyển đổi các giá trị DẤU THỜI GIAN từ múi giờ hiện tại sang UTC để lưu trữ và ngược lại từ UTC sang múi giờ hiện tại để truy xuất. (Điều này không xảy ra đối với các loại khác như DATETIME. ) Theo mặc định, múi giờ hiện tại cho mỗi kết nối là thời gian của máy chủ.

Lập chỉ mục cột ngày có tốt không?

Có, nói chung nên có một chỉ mục trên trường được sử dụng trong tiêu chí truy vấn . Điều này thực sự hữu ích khi có một số lượng lớn tài liệu (e. g. , một triệu) trong bộ sưu tập. Chỉ mục sẽ được sử dụng để chạy truy vấn nhanh.