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