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

时间:2018-01-02 11:41:16

标签: php mysql database laravel

我想从最后一个到第一个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

4 个答案:

答案 0 :(得分:0)

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

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

create index idx_bookings_booking_id on bookings(booking_id)

答案 1 :(得分: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`; 

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

如果遗漏任何内容,请添加

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

告诉我这听起来是不是这样:

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

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

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

您不需要限制或排序。

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

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