Php 更重要的是,要求管理员提供更多的细节。不要担心分页的复杂性
我已经实施了各种各样的机制和其他机制。回想起来,我唯一一次对几十个项目使用分页是在我需要对所有项目采取行动的时候。示例:从一次旅行中挑选一千张照片中的哪一张进入“相册”。这涉及到看每一张图片足够长的时间来挑选或拒绝每一张图片。此外,我还使用AJAX单击所有需要的操作 滚动浏览数千条记录 编写查询(可能是临时查询),以筛选到更少的记录。如果管理员需要滚动查看几十条以上的记录,那么您(和数据库)就让他失望了 分页——不要使用Php 更重要的是,要求管理员提供更多的细节。不要担心分页的复杂性,php,mysql,partitioning,Php,Mysql,Partitioning,我已经实施了各种各样的机制和其他机制。回想起来,我唯一一次对几十个项目使用分页是在我需要对所有项目采取行动的时候。示例:从一次旅行中挑选一千张照片中的哪一张进入“相册”。这涉及到看每一张图片足够长的时间来挑选或拒绝每一张图片。此外,我还使用AJAX单击所有需要的操作 滚动浏览数千条记录 编写查询(可能是临时查询),以筛选到更少的记录。如果管理员需要滚动查看几十条以上的记录,那么您(和数据库)就让他失望了 分页——不要使用偏移量;“还记得你刚才说的话吗”: 分区——否;你还没有提出一个它会受益的案
偏移量;“还记得你刚才说的话吗”:
分区——否;你还没有提出一个它会受益的案例。您可以简单地说WHERE name,比如'J%'
或WHERE name>='P'和name
(用于P、q、r、s),并有一个索引,以name
开头;但我怀疑这是否真的对管理员有帮助
“一个不断向下钻取的递归函数”——这是BTree索引已经为您做过的事情。只需执行WHERE name>$leftoff ORDER BY name LIMIT 20
。即,对铲斗尺寸使用限制
;同时,不要费心预先定义桶边界
“潜在内存使用”——通常最好让数据库拥有大部分可用内存
表1对表3——请详细说明这些表中的内容
搜索
正如其他人所说,使用某种搜索机制可能是获得所需记录的最快方法。不要让管理员滚动数千行
提供一个表单,其中包含一项或多项内容,供管理员填写
- 完整的用户名。(问题:拼写错误/不知道确切的拼写)
- 通配符部分名称。例如:“丹%”;然后显示以Dan开头的所有用户名
- 一个庞大的超链接列表,每个用户一个。这是可行的多达几千;我建议不要这样做,理由不止这些
- 用户的一个属性——开始日期、无活动等等。然后搜索该属性
对于这些局部情况,拒绝显示100个以上的用户名;如果超过这个,要求管理员提供更多的细节。不要担心分页的复杂性
我已经实施了各种各样的机制和其他机制。回想起来,我唯一一次对几十个项目使用分页是在我需要对所有项目采取行动的时候。示例:从一次旅行中挑选一千张照片中的哪一张进入“相册”。这涉及到看每一张图片足够长的时间来挑选或拒绝每一张图片。此外,我还使用AJAX单击所有需要的操作。这不是简单的分页吗?“如果管理员想要编辑特定用户的信息”…您不打算提供搜索功能以用户友好的方式启用这种功能吗?正如草莓所说,你所描述的其他内容似乎只是常规分页。我认为您可能过度设计了您建议的解决方案。@如果系统上有100000个用户,那么分页真的不起作用。@ADyson我没有考虑包含搜索字段。我已经想好了如何做到这一点。至于分页,我不确定如果系统上有100000个帐户,这是否可行。即使是10000个用户也不太容易管理。有了大量的用户,我认为任何类型的列表都可能是徒劳的,不管是分区的、分页的还是其他的。对我来说,搜索功能(可能比较灵活,因此它可以根据属性组合和字段的部分匹配等查找用户)似乎是最好的选择。这不是简单的分页吗?“如果管理员想要编辑特定用户的信息”…您不打算提供搜索功能,以用户友好的方式实现这类功能吗?正如草莓所说,你所描述的其他内容似乎只是常规分页。我认为您可能过度设计了您建议的解决方案。@如果系统上有100000个用户,那么分页真的不起作用。@ADyson我没有考虑包含搜索字段。我已经想好了如何做到这一点。至于分页,我不确定如果系统上有100000个帐户,这是否可行。即使是10000个用户也不太容易管理。有了大量的用户,我认为任何类型的列表都可能是徒劳的,不管是分区的、分页的还是其他的。对我来说,搜索功能(可能相对灵活,因此它可以根据属性组合和字段的部分匹配等找到用户)似乎是最好的选择。我用更多信息更新了问题。至于相关问题1表与3表。我也不确定那些桌子里会有什么。现在,我有两张桌子。将用户名链接到用户id的主用户表指定帐户是否处于活动状态、登录方法、配置文件id以及该用户的组织id。另一个表是userpart,我已经发布了这个模式。@DanielRudy-我必须和其他人一起推动一些搜索机制。(我补充了我的回答。)与此同时,我在你关于计数的讨论中迷失了方向。计数多少有些像是在转移视线。它们用于跟踪一个bucket中有多少用户,并在我开发平台时用于诊断目的。我不久前通过在数据库中存储一棵树解决了这个问题。我正在使用“FK到父对象”和节点的路径。如果数据发生更改,则清空整个表并重新创建数据。使用此方法,我现在可以对用户列表进行深入了解。实现这一目标的RDBMS方法是firs
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));
}
}
}
mysql> select sum(`count`) from userpart;
+--------------+
| sum(`count`) |
+--------------+
| 100004 |
+--------------+
1 row in set (0.01 sec)
mysql> select count(*) from userpart where count = 0;
+----------+
| count(*) |
+----------+
| 1139 |
+----------+
1 row in set (0.01 sec)
function part_recurse($prefix)
{
global $charCount;
global $charList;
global $CONFIGVAR;
$list = dbCountScan($prefix);
$acc = 0;
$start = substr($charList, 0, 1);
for ($i = 0; $i < count($list); $i++)
{
if ($list[$i] == 0) continue;
if ($list[$i] > $CONFIGVAR['user_partition_max_size']['value'])
{
// If the number of entries > threshold...
if ($i == 0)
{
// Only for the first bucket.
$start = substr($charList, 1, 1);
}
else
{
// All other entries.
if ($i >= $charCount - 1)
{
// Last entry
$end = substr($charList, $i - 1, 1);
$acc += $list[$i];
writeRange($prefix . $start, $prefix . $end, $acc,
substr($prefix . substr($charList, $i, 1), 0, 1));
$acc = 0;
}
else
{
$end = substr($charList, $i - 1, 1);
writeRange($prefix . $start, $prefix . $end, $acc,
substr($prefix . substr($charList, $i + 1, 1), 0, 1));
$acc = 0;
$start = substr($charList, $i, 1);
}
}
part_recurse($prefix . substr($charList, $i, 1));
}
else
{
if (($acc + $list[$i]) >= $CONFIGVAR['user_partition_max_size']['value'])
{
$end = substr($charList, $i - 1, 1);
writeRange($prefix . $start, $prefix . $end, $acc,
substr($prefix . substr($charList, $i, 1), 0, 1));
$start = substr($charList, $i, 1);
$acc = $list[$i];
}
else
{
$acc += $list[$i];
}
}
}
// Write the final entry.
if ($acc > 0)
{
$end = substr($charList, $charCount - 1, 1);
$bucket = substr($prefix . substr($charList, $i, 1), 0, 1);
writeRange($prefix . $start, $prefix . $end, $acc, $bucket);
}
}
mysql> select sum(`count`) from userpart;
+--------------+
| sum(`count`) |
+--------------+
| 105234 |
+--------------+
1 row in set (0.00 sec)
mysql> select count(*) from userpart where count = 0;
+----------+
| count(*) |
+----------+
| 316 |
+----------+
1 row in set (0.00 sec)
CREATE TABLE `userpart` (
`rangest` varchar(16) NOT NULL COMMENT 'Database query starting range.',
`rangeed` varchar(16) NOT NULL COMMENT 'Database query ending range.',
`count` int unsigned NOT NULL COMMENT 'Count in range.',
`bucket` varchar(5) DEFAULT NULL COMMENT 'Primary bucket.'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Table that is used to partition usernames.'