如何在搜索中处理一个非常大的表?

时间:2018-01-26 02:33:15

标签: javascript python django

我正在寻找有关如何使用python django框架处理以下用例场景的建议,我也愿意使用javascript libraries / ajax。

我正在使用名为revenue_code的预先存在的表/模型,其中包含超过6亿行数据。

用户需要在一次搜索中搜索三个字段(代码,描述,房间),并且能够选择多个类似于kendo控件多选的搜索结果。我首先通过组合django-filters中的代码开始,如下所示,但我的应用程序没有响应,等待10-15分钟后,我能够查看搜索结果但无法选择任何内容。

https://simpleisbetterthancomplex.com/tutorial/2016/11/28/how-to-filter-querysets-dynamically.html

我还尝试使用kendo控件,select2和选择,因为我需要用户能够选择尽可能多的转码,因为它们需要向上10-20,但是当它尝试时都会给出相同的无响应页面将数据加载到控件/多选中。

基本上我正在寻找的是下面的内容,它允许用户选择多个选项并处理大量数据而不会无响应?理想情况下,我希望能够在不显示所有数据的情况下查询我的搜索。

https://petercuret.com/add-ajax-to-django-without-writing-javascript/

Django框架是否意味着处理这种类型的卷。将此数据导出到文件并读取文件会更好吗?我不是在寻找代码,只是关于如何处理这个用例的一些指示。

2 个答案:

答案 0 :(得分:2)

“搜寻6亿”的基本机制是什么?基本上数据库如何在搜索时间之前构建索引,并且对于不同类型的查询足够通用,然后在搜索时您只搜索索引 - 这要小得多(放入内存)并且更快。但无论如何,“搜索”其性质,没有“分页”的概念 - 如果600万条记录不能同时进入内存,那么需要多次交换并输入6亿条记录中的部分内容 - 更多部件然后操作越慢。这些隐藏在MySQL等数据库中的算法背后。

有一个非常紧凑的表示,如位图索引,可以让你非常快速地搜索男/女等数据,或者你可以使用每条信息一位的任何数据。

因此,无论Django与否,都不重要。重要的是调整数据库,设计表以便于查询(索引类型),以及服务器端的内存总量以将数据保存在内存中。

检查出来:

https://dba.stackexchange.com/questions/20335/can-mysql-reasonably-perform-queries-on-billions-of-rows

https://serverfault.com/questions/168247/mysql-working-with-192-trillion-records-yes-192-trillion

How many rows are 'too many' for a MySQL table?

答案 1 :(得分:1)

您无法一次将所有数据加载到您的页面中。 6亿条记录太多了。

由于您提到了select2,请查看带有pagination的示例。

诀窍是一次将SQL结果限制在100左右。当用户滚动到列表底部时,它可以自动加载更多。

将搜索查询发送到服务器,并在SQL(或NoSQL或您使用的任何内容)中进行过滤。数据库引擎就是为此而构建的。不要尝试使用那么多记录在JS中进行过滤/排序。