我想从最后一个到第一个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
答案 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比内存查找慢得多)。
答案 3 :(得分:0)
您似乎需要另一种解决方法,例如物化视图。
告诉我这听起来是不是这样:
创建另一张表,例如预订表,例如CREATE TABLE booking_short LIKE预订。虽然您只需要booking_id列
并检查您的代码,确定您在何处创建预订单,例如您首先插入预订的地方。 SELECT COUNT(*)FROM booking_short。如果> 20,则删除第一条记录。插入新的booking_id。
您可以在加入之前选择ID并从中加入,以获取有关其余表格的更多详细信息。
您不需要限制或排序。
当然,这需要大量文档以避免维护问题。