Mysql从最后一个到第一个 - [很多记录]

问题描述 投票:1回答:4

我想从最后一个到第一个LIMIT 20从mysql中获取记录。我的数据库有超过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
php mysql database laravel
4个回答
0
投票

我想如果你在没有order by的情况下执行查询,时间会令人满意吗?

您可能会尝试在订购的列中创建索引:

create index idx_bookings_booking_id on bookings(booking_id)


0
投票

您可以尝试使用查找查询的复杂性

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`; 

如果索引我们没有在那里创建适当的索引

如果有任何遗漏,请添加


0
投票

如果我没有弄错,索引查找表需要能够驻留在内存中(filesort比内存查找慢得多)。

  • 使用小索引/列大小
  • 对于容量增加一倍,如果不需要负值,请使用UNSIGNED列。
  • 调整sort_buffer_size和read_rnd_buffer_size(在连接级别上可能更好,而不是全局)
  • 请参阅https://dev.mysql.com/doc/refman/5.7/en/order-by-optimization.html,特别是关于使用EXPLAIN和可能尝试其他执行计划策略。

0
投票

您似乎需要另一种解决方法,例如物化视图。

告诉我,如果这听起来像这样:

创建另一个表,如预订表,例如CREATE TABLE booking_short LIKE预订。虽然您只需要booking_id列

并检查您的代码,以确定您在何处创建预订订单,例如您首先插入预订的地方。 SELECT COUNT(*)FROM booking_short。如果大于20,则删除第一条记录。插入新的booking_id。

您可以在加入之前选择ID并从中加入,以获取有关其余表的更多详细信息。

您不需要限制或排序。

当然,这需要大量文档以避免维护问题。

无论是那个还是https://stackoverflow.com/a/5912827/6288442

© www.soinside.com 2019 - 2024. All rights reserved.