[英]Mysql fetch from last to first - [many records]
我想從mysql的最后一個到第一個LIMIT 20中獲取記錄。我的數據庫有超過1M個記錄。 我知道順序。 但是從我的理解來看,在使用訂單的過程中,它會永久加載20條記錄,我一點都不奇怪。 但我認為mysql在下訂單前會獲取所有記錄。
SELECT bookings.created_at, bookings.total_amount,
passengers.name, passengers.id_number, payments.amount,
passengers.ticket_no,bookings.phone,bookings.source,
bookings.destination,bookings.date_of_travel FROM bookings
INNER JOIN passengers ON bookings.booking_id = passengers.booking_id
INNER JOIN payments on payments.booking_id = bookings.booking_id
ORDER BY bookings.booking_id DESC LIMIT 10
我想如果您在沒有時間的情況下執行查詢order by
那會令人滿意嗎?
您可以嘗試在要訂購的列中創建索引:
create index idx_bookings_booking_id on bookings(booking_id)
您可以嘗試使用以下方法找出查詢的復雜性
EXPLAIN SELECT bookings.created_at, bookings.total_amount,
passengers.name, passengers.id_number, payments.amount,
passengers.ticket_no,bookings.phone,bookings.source,
bookings.destination,bookings.date_of_travel FROM bookings
INNER JOIN passengers ON bookings.booking_id = passengers.booking_id
INNER JOIN payments on payments.booking_id = bookings.booking_id
ORDER BY bookings.booking_id DESC LIMIT 10
然后檢查是否在表上創建了正確的索引
SHOW INDEX FROM `db_name`.`table_name`;
如果索引不存在,則在所有表上創建適當的索引
如果缺少任何內容,請添加
如果我沒有記錯的話,索引查找表必須能夠駐留在內存中(文件排序比內存中查找慢得多)。
您似乎還需要其他變通方法,例如物化視圖。
告訴我這是否聽起來像這樣:
創建另一個類似於預訂表的表,例如CREATE TABLE booking_short LIKE booking。 雖然您只需要booking_id列
並檢查您的代碼,以准確地確定預訂單的位置,例如您首次插入預訂的位置。 從booking_short中選擇COUNT(*)。 如果大於20,則刪除第一條記錄。 插入新的booking_id。
您可以選擇ID並從那里開始聯接,然后再聯接以獲取有關其余表的更多詳細信息。
您不需要限制或排序。
當然,這需要大量文檔來避免維護問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.