Cách nhanh nhất để lấy hàng cuối cùng từ một bảng là gì?


11

Tôi có một bảng PostgreSQL Prices, với các cột:

  • price (Số thập phân)
  • product_id (Int)

Ngoài ra còn có created_atupdated_atcột.

Giá được cập nhật thường xuyên và tôi giữ giá cũ trong bảng. Đối với một sản phẩm nhất định, giá cuối cùng trong bảng là giá hiện tại.

Cách hiệu quả nhất để có được giá cuối cùng cho một sản phẩm cụ thể là gì:

  • Chỉ mục product_idvà truy vấn cho bản ghi cuối cùng
  • Thêm cột thứ ba active(Boolean) để đánh dấu giá mới nhất và tạo chỉ mục tổng hợp ( product_idactive)
  • Hay cái gì khác?

4
Sử dụng một chỉ mục một phần với điều kiện where activecó thể sẽ giúp nhiều hơn để lấy sản phẩm mới nhất.
a_horse_with_no_name

Câu trả lời:


11

Bạn sẽ cần một chỉ mục trên sản phẩm_id bất kể giải pháp.

Miễn là bạn có một chỉ mục trên cột update_at và tất cả những gì bạn cần là tìm nạp "một sản phẩm cụ thể" như bạn đã nêu, thì tôi sẽ làm:

select *
from Prices
where product_id = ?
order by updated_at desc 
limit 1

Nhưng nếu tôi không nhận được kết quả tôi muốn hoặc nếu tôi cần lấy giá hiện tại cho nhiều sản phẩm, thì tôi sẽ thử tùy chọn thêm cột hoạt động và đặt nó thành N cho tất cả các giá khác với giá mới khi thực hiện cập nhật giá và sau đó tôi sẽ tạo một chỉ mục một phần trong đó hoạt động theo đề xuất của a_horse_with_no_name. Tôi sẽ đến đó chỉ khi tôi cần vì nó thêm một lớp phức tạp của việc cập nhật các hàng giá trước đó để không hoạt động, v.v.


1
Truy vấn này cần một chỉ mục trên (product_id, updated_at)- hoặc trên (product_id, updated_at DESC)- để có hiệu quả. Không chỉ trên (updated_at).
ypercubeᵀᴹ

5

Nếu không có kiến ​​thức về phần còn lại của cơ sở dữ liệu của bạn, bạn có thể mua một chút hình thức không bình thường để tăng tốc độ tìm nạp giá sản phẩm (giả sử có một giá cho mỗi mặt hàng).

Chỉ cần tạo một cột mới có tên last_priceloại pricetrong productbảng của bạn và tạo một kích hoạt AFTER INSERT ON EACH ROWtrên pricebảng của bạn . Mỗi khi một mức giá mới được tạo ra, nó sẽ cập nhật sản phẩm liên quan với mức giá mới nhất. Bằng cách này, mỗi khi bạn lấy một sản phẩm, bạn cũng lấy giá cuối cùng của nó.

Kể từ phiên bản 9.3, PostgreSQL hỗ trợ các khung nhìn cụ thể hóa. Đây là một cách hay để chuẩn hóa dữ liệu, giữ một hình thức bình thường để viết và chế độ xem không chuẩn hóa để đọc. Bản cập nhật của chế độ xem có thể được kích hoạt bằng cơ chế LISTEN / NOTIFY của Postgres.

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.