背景
我正在为 Web 应用程序开发一个 Web 平台。该平台的关键功能之一是用户管理。因此,我实现了一个登录系统,使注册用户能够登录平台和应用程序。这是使用包含登录凭据、用户标识、联系信息等的 MySQL 数据库实现的...
问题
我遇到的问题是用户表。该表可能会非常大。因此,如果管理员想要根据用户在列表中的位置编辑特定用户的信息,则管理员将不得不滚动浏览可能有数千条记录以找到正确的记录。我正在寻找一种算法,它将把它分成大小约为 N 的组,并将这些组显示为管理员可以单击的范围:#0-B、CF、GL、MR 等....
研究
这是我迄今为止进行的研究:
关于分区,我在网上找到了很多关于对数据库表进行分区的文章,但没有任何内容可以解决我正在尝试做的事情。
到目前为止我做了什么
我编写了一个从 Web 服务器离线运行的程序,该程序返回每个存储桶 0-9 和 AZ 的计数。对于小于阈值的计数,它将桶组合成一个范围并将其保存到数据库中。因此,如果桶 0-9 和 A、B 的总数小于阈值,则范围变为#0-B。如果桶的大小大于阈值,我在尝试弄清楚如何从桶中获取范围时遇到问题。
我考虑了以下解决方案:
一个递归函数,不断向下钻取用户名,直到它在阈值范围内。如果我能让它工作,这将是理想的。
由于这是离线运行的,我喜欢的另一个解决方案是将整个存储桶加载到内存中并从那里拆分。这样做的缺点是潜在的内存使用。
我感兴趣的另一个想法是 #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));
}
}
}
GCT1015