猿问

将大型数据集拆分成较小的部分以供 Web 查看

背景

我正在为 Web 应用程序开发一个 Web 平台。该平台的关键功能之一是用户管理。因此,我实现了一个登录系统,使注册用户能够登录平台和应用程序。这是使用包含登录凭据、用户标识、联系信息等的 MySQL 数据库实现的...

问题

我遇到的问题是用户表。该表可能会非常大。因此,如果管理员想要根据用户在列表中的位置编辑特定用户的信息,则管理员将不得不滚动浏览可能有数千条记录以找到正确的记录。我正在寻找一种算法,它将把它分成大小约为 N 的组,并将这些组显示为管理员可以单击的范围:#0-B、CF、GL、MR 等....

研究

这是我迄今为止进行的研究:

数据库分区 - PHP 或 MySQL 更好?

1 张非常大的桌子还是 3 张大桌子?MySQL 性能

关于分区,我在网上找到了很多关于对数据库表进行分区的文章,但没有任何内容可以解决我正在尝试做的事情。

到目前为止我做了什么

我编写了一个从 Web 服务器离线运行的程序,该程序返回每个存储桶 0-9 和 AZ 的计数。对于小于阈值的计数,它将桶组合成一个范围并将其保存到数据库中。因此,如果桶 0-9 和 A、B 的总数小于阈值,则范围变为#0-B。如果桶的大小大于阈值,我在尝试弄清楚如何从桶中获取范围时遇到问题。

我考虑了以下解决方案:

  1. 一个递归函数,不断向下钻取用户名,直到它在阈值范围内。如果我能让它工作,这将是理想的。

  2. 由于这是离线运行的,我喜欢的另一个解决方案是将整个存储桶加载到内存中并从那里拆分。这样做的缺点是潜在的内存使用。

  3. 我感兴趣的另一个想法是 #2 的一个变体,它将桶的一部分加载到内存中并对其进行处理。这会将内存使用量减少到或多或少的固定数量,但需要更多时间来处理。

编辑 5-11/2020:

基于一个答案和评论,我可以有一个搜索字段,当条目数缩小到阈值以下时,它会使用 JSON 填充列表(这是个好主意)。但是,我确实有我将与您分享的代码:

此代码有效,但对于测试数据,它在分区表中创建了约 17,500 个条目,并且有相当多的条目计数为零。

function part_recurse2($prefix)

{

    global $CONFIGVAR;

    global $charList;

    global $charCount;


    $list = dbCountScan($prefix);

    for ($i = 0; $i < count($list); $i++)

    {

        $char = substr($charList, $i, 1);

        if ($list[$i] >= $CONFIGVAR['user_partition_max_size']['value'])

        {

            part_recurse2($prefix . $char);

        }

        else

        {

            writeRange($prefix . $char, $prefix . $char, $list[$i],

                substr($prefix . $char, 0, 1));

        }

    }

}


蓝山帝景
浏览 99回答 1
1回答

GCT1015

滚动浏览可能有数千条记录编写查询,可能是临时的,以过滤出更少的记录。如果管理员需要滚动浏览超过几十条记录,那么你(和数据库)就让他失望了。分页——不要使用OFFSET;&nbsp;“记住你离开的地方”:http:&nbsp;//mysql.rjweb.org/doc.php/pagination分区——否;你还没有提出一个它会受益的案例。你可以简单地说WHERE name LIKE 'J%'or&nbsp;WHERE name >= 'P' AND name < 'T'(for p,q,r,s)并INDEXname以;开头&nbsp;但我怀疑这是否真的对管理员有帮助。“一个不断向下钻取的递归函数”——这就是 BTree 索引已经为您做的事情。简单地做WHERE name > $leftoff ORDER BY name LIMIT 20。即,LIMIT用于桶大小;同时不要打扰预定义桶边界。“潜在内存使用”——让数据库拥有大部分可用内存通常更好。1 表 vs 3 -- 请详细说明这些表中的内容。搜索中正如其他人所说,使用某种搜索机制可能是找到所需记录的最快方法。不要让管理员滚动浏览数千行。提供一个表格,其中包含一项或多项内容供管理员填写完整的用户名。(问题:拼写错误/不知道确切的拼写)通配符部分名称。例子:'段%';&nbsp;然后显示所有以 Dan 开头的用户名。大量的超链接列表,每个用户一个。最多可达几千个;我会建议不要这样做。用户的一个属性——开始日期、无活动等等。然后搜索该属性。对于这些部分情况,拒绝显示超过100个用户名;如果不止于此,请要求管理员提供更多详细信息。不要为分页增加的复杂性而烦恼。我已经实施了各种这些和其他机制。回想起来,我唯一一次对几十个项目使用分页是在我需要对所有项目采取行动时。示例:从旅行中的一千张图片中挑选一张放入“相册”。这包括看每张照片足够长的时间来挑选或拒绝每一张。此外,我使用 AJAX 来单击一次所需的所有操作。
随时随地看视频慕课网APP
我要回答