簡體   English   中英

Mysql從最后到第一次獲取-[許多記錄]

[英]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`; 

如果索引不存在,則在所有表上創建適當的索引

如果缺少任何內容,請添加

如果我沒有記錯的話,索引查找表必須能夠駐留在內存中(文件排序比內存中查找慢得多)。

  • 使用較小的索引/列大小
  • 對於雙倍容量,如果不需要負值,請使用UNSIGNED列。
  • 調整sort_buffer_size和read_rnd_buffer_size(在連接級別上可能更好,而不是全局)
  • 請參閱https://dev.mysql.com/doc/refman/5.7/en/order-by-optimization.html ,尤其是有關使用EXPLAIN以及可能嘗試其他執行計划策略的信息。

您似乎還需要其他變通方法,例如物化視圖。

告訴我這是否聽起來像這樣:

創建另一個類似於預訂表的表,例如CREATE TABLE booking_short LIKE booking。 雖然您只需要booking_id列

並檢查您的代碼,以准確地確定預訂單的位置,例如您首次插入預訂的位置。 從booking_short中選擇COUNT(*)。 如果大於20,則刪除第一條記錄。 插入新的booking_id。

您可以選擇ID並從那里開始聯接,然后再聯接以獲取有關其余表的更多詳細信息。

您不需要限制或排序。

當然,這需要大量文檔來避免維護問題。

要么https://stackoverflow.com/a/5912827/6288442

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM