要获取最后10条记录,在MySQL查询中添加“LIMIT”可以加快速度吗?

时间:2018-01-03 04:47:10

标签: mysql

有人可以解释我是否想要获取最后10条记录,将“LIMIT”添加到MySQL查询会让它更快吗? 像

from django.shortcuts import render
from django.views.generic import ListView
from chat.models import Chat
from chat.forms import NewMessageForm

class ChatListView(ListView):
    model = Chat
    template_name = 'chat.html'
    paginate_by = 20

    ##I had a hard time rendering the form in html and this code solves the problem (from a stackoverflow answer)
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['form'] = NewMessageForm()
        return context

    ##I'm not sure of this code. Am I doing it right?
    def new_message(request):
        if request.method == 'POST':
            form = NewMessageForm(request.POST)
            if form.is_valid():
                form.save()
                return redirect('chat')
        else:
            form = NewMessageForm()
        return render(request, 'chat.html', {'form': form})

有没有其他方法来获取最后10条记录还是更快?

3 个答案:

答案 0 :(得分:1)

limit的问题是,在仅返回最后50个行之前,必须在表中排序所有行,所以它总是要去随着表的增长(不可缩放),速度会变慢。

获得最后50分的最快方法是:

SELECT 
  *
FROM
  `table`
WHERE id > (SELECT MAX(id) FROM `table`) - 50

这将使用id上的索引获取最大ID,然后再次获得前50名。

您还应该尝试稍微复杂一些但可能更好的优化:

SELECT 
  *
FROM
  `table`
WHERE id BETWEEN (SELECT MAX(id) FROM `table`) - 49
    AND (SELECT MAX(id) FROM `table`)

比较实际运行时间并最快。

答案 1 :(得分:0)

添加限制可以加快速度。多数民众赞成。在这种情况下,将选择插入数据库的最后10条记录

答案 2 :(得分:0)

您可以使用INsubquery派生表而不是限制,后面可以跟一个动态rownum变量。但这可能是非常复杂和缓慢的替代方案 因此,我建议您使用相同查询来获取表格中的最后一行,而不是任何其他替代方法。如果你想使用子查询,那么你必须跟踪最大id数据,并且可能删除或删除了一些数据,然后它不能返回适当数量的记录。 而且,您可以使用col name代替*进行更多优化。