วิธีที่เร็วที่สุดในการดึงข้อมูลแถวสุดท้ายจากตารางคืออะไร


11

ฉันมีตาราง PostgreSQL Pricesโดยมีคอลัมน์:

  • price (ทศนิยม)
  • product_id (Int)

นอกจากนี้ยังมีcreated_atและupdated_atคอลัมน์

ราคาอัพเดทเป็นประจำและฉันเก็บราคาเก่าไว้ในตาราง สำหรับผลิตภัณฑ์ที่กำหนดราคาสุดท้ายในตารางคือราคาปัจจุบัน

วิธีที่มีประสิทธิภาพที่สุดในการรับราคาสุดท้ายสำหรับผลิตภัณฑ์เฉพาะคืออะไร:

  • ดัชนีproduct_idและแบบสอบถามสำหรับระเบียนสุดท้าย
  • เพิ่มคอลัมน์ที่สามactive(บูลีน) เพื่อทำเครื่องหมายราคาล่าสุดและสร้างดัชนีคอมโพสิต ( product_idและactive)
  • หรืออย่างอื่น?

4
การใช้ดัชนีบางส่วนพร้อมเงื่อนไขwhere activeอาจช่วยได้มากขึ้นในการเรียกค้นผลิตภัณฑ์ล่าสุด
a_horse_with_no_name

คำตอบ:


11

คุณจะต้องมีดัชนีใน product_id โดยไม่คำนึงถึงวิธีการแก้ปัญหา

ระบุว่าคุณมีดัชนีในคอลัมน์ updated_at และสิ่งที่คุณต้องการก็คือดึง "ผลิตภัณฑ์เฉพาะ" ตามที่คุณระบุจากนั้นฉันจะทำดังนี้

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

แต่ถ้าฉันไม่ได้รับผลลัพธ์ที่ฉันต้องการหรือถ้าฉันต้องการรับราคาปัจจุบันสำหรับผลิตภัณฑ์จำนวนมากฉันจะลองตัวเลือกในการเพิ่มคอลัมน์ที่ใช้งานอยู่และตั้งค่าเป็น N สำหรับราคาอื่น ๆ ทั้งหมดนอกเหนือจากใหม่เมื่อทำ อัปเดตราคาแล้วฉันจะสร้างดัชนีบางส่วนที่ใช้งานได้ตามที่แนะนำโดย a_horse_with_no_name ฉันจะไปที่นั่นก็ต่อเมื่อฉันต้องการเพราะมันเป็นการเพิ่มความซับซ้อนของการอัปเดตแถวราคาก่อนหน้าเพื่อไม่ให้ใช้งานได้ ฯลฯ


1
แบบสอบถามนี้ต้องการดัชนีใน(product_id, updated_at)- หรือ (product_id, updated_at DESC)- - เพื่อให้มีประสิทธิภาพ ไม่เพียง (updated_at)แต่ใน
ypercubeᵀᴹ

5

หากไม่มีความรู้เกี่ยวกับฐานข้อมูลส่วนที่เหลือของคุณคุณสามารถซื้อแบบฟอร์มที่ไม่ปกติเพื่อเร่งการดึงราคาผลิตภัณฑ์ (สมมติว่ามีหนึ่งราคาสำหรับแต่ละรายการ)

เพียงสร้างคอลัมน์ใหม่ที่ชื่อlast_priceประเภทpriceในproductตารางของคุณและสร้างทริกเกอร์AFTER INSERT ON EACH ROWบนpriceตารางของคุณ ทุกครั้งที่มีการสร้างราคาใหม่จะอัปเดตผลิตภัณฑ์ที่เกี่ยวข้องด้วยราคาล่าสุด ด้วยวิธีนี้ทุกครั้งที่คุณดึงผลิตภัณฑ์คุณจะได้ราคาล่าสุด

ตั้งแต่เวอร์ชัน 9.3 PostgreSQL รองรับมุมมองที่ปรากฏขึ้น นี่เป็นวิธีที่ดีในการทำให้ข้อมูลผิดปกติรักษารูปแบบปกติสำหรับการเขียนและมุมมองที่ผิดปกติสำหรับการอ่าน การอัพเดตมุมมองสามารถถูกทริกเกอร์โดยกลไก LISTEN / NOTIFY ของ Postgres


-1

คุณควรมีคอลัมน์ของวันที่และเวลาของ wef (โดยมีผลจาก) ในตารางราคา ผู้ใช้จะป้อนค่าในขณะที่ปรับปรุงราคา หลังจากนั้นดึงค่าเฉพาะที่มี desc wef จำกัด 1


สิ่งนี้ไม่ตอบคำถาม
Colin 't Hart
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.