我想从mysql获取从最后到第一个限制20的记录。我的数据库有超过一百万条记录。我知道你的命令。但从我的理解,当使用顺序,它需要永远加载20个记录,我没有奇怪的想法。但我想在点菜前把所有的唱片都取出来。
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条答案
按热度按时间kq4fsx7k1#
您似乎需要另一种解决方法,如物化视图。
如果这听起来像:
创建另一个类似于预订表的表,例如创建类似预订的表。尽管你只需要预订id栏
并检查您的代码,以确定您创建预订订单的确切位置,例如,您第一次插入预订的位置。从booking\u short中选择count(*)。如果大于20,则删除第一条记录。插入新的预订id。
您可以在连接其他表之前从中选择id和join,以了解更多详细信息。
你不需要限制或分类。
当然,这需要大量的文档来避免维护问题。
不是那样就是https://stackoverflow.com/a/5912827/6288442
nmpmafwu2#
我想如果执行查询时没有
order by
时间会令人满意吗?您可以尝试在要排序的列中创建索引:
create index idx_bookings_booking_id on bookings(booking_id)
qaxu7uf23#
如果我没弄错的话,索引查找表需要能够驻留在内存中(filesort比mem查找慢得多)。
使用较小的索引/列大小
对于双精度输入,如果不需要负值,请使用无符号列。。
调整排序缓冲区大小和读取缓冲区大小(在连接级别上可能更好,而不是全局)
看到了吗https://dev.mysql.com/doc/refman/5.7/en/order-by-optimization.html ,特别是关于使用解释和可能尝试另一个执行计划策略。
xyhw6mcr4#
您可以尝试使用
然后检查是否在表上创建了正确的索引
如果索引不存在,则在所有表上创建适当的索引
如果缺什么请加上