我有一个复杂的查询,返回超过30,000条记录。我们一次向用户显示100条记录,用户必须单击下一步才能获得下一条记录。
这里的问题是我们再次对数据库运行复杂查询,并添加LIMIT 100,200来获取接下来的100条记录。
除了这种复杂性之外,我们在客户端还有其他过滤器,必须在30,000条记录上执行。数据库中大约有1万个用户。因此,对于非常活动,我们一次又一次地运行该复杂查询。
有没有办法保留30,000条记录并对其进行操作?我检查了临时MYSQL表。但我不认为我们可以在这种情况下使用它们。要将数据存储在物理表中并对其进行查询,如果1000个用户一次尝试访问此未来并以编程方式处理它(插入和删除操作),那么这将是一个很大的混乱。
更新以提供更多详情
- >这是确切的情景,汽车公司希望看到给定距离内的所有汽车,例如距离给定纬度和经度的100英里半径与汽车和用户详细信息。在combox中执行此操作后,将显示汽车模型以及该数据表下方的所有信息。同样在每列的顶部有一个用于搜索该列的文本字段(例如,在客户名称上,输入两个字母开始过滤数据)。 1)获得100英里的城市 2)查询数据库(这里组合5个表) 3)从上面的查询中获取汽车模型列表并将其显示在列表框中 4)向用户显示100条记录 5)根据copbox框列表和每列的文本字段进行过滤
太简单了:) - >
感谢您的帮助
此致
基兰
答案 0 :(得分:0)
我公司的应用程序处理超过200万条记录和众多联接,我们使用jQuery DataTables非常优雅地处理这个问题。是的,这是前端技术......但是用户,数据表和我们的查询之间的交互使其成为一个非常优雅的解决方案。除了索引表之外,我们根本不做任何视图或存储过程,并且它适用于zippy。
DataTables是一个网格 - 一个具有额外功能的表,包括排序,分页,过滤等。它一次通过Ajax,X抓取数据,并在查询中添加其他元素以使附加功能发生。它真正让人眼前一亮的是当你使用一个名为“流水线”的功能时,它会在你显示的内容之前和之后抓取数据,减少查询量,同时为用户提供更快的查看体验。它是一个内置功能,非常易于部署。
以下是关于流水线的啧啧:http://datatables.net/examples/server_side/pipeline.html
以下是我使用的查询示例:
public static function getQueue( $q=false) {
$connect = new db_connection();
$query = ' SELECT something
FROM table
WHERE 1 ';
if ($q['id']) {
$query .= " AND id = ".$q['id']." ";
}
if ($q['sortOrder']) {
$query .= "ORDER BY " . $q['sortField']. " " .$q['sortOrder']. " ";
}
if ($q['limit']) {
$query .= ' LIMIT '.$q['limit'];
}
if ($q['offset']) {
$query .= ' OFFSET '.$q['offset'];
}
$result = $connect->query($query);
$queue_array = $connect->fetchAll($result);
return $queue_array;
}
如果您之前从未使用过Jquery Ajax,那么它正在查找字符串中的结果。所以,我有一个页面,通过上面的查询调用下面的函数来回显结果。我称之为我的ajaxDispatcher:
public static function showQueue($info) {
$q['limit'] = $info['iDisplayLength'];
$q['offset'] = $info['iDisplayStart'];
//Ordering
if ( isset( $info['iSortCol_0'] ) ) {
for ( $i=0 ; $i < $info['iSortingCols']; $i++ ) {
$q['sortField'] .= self::queueHeaders($info['iSortCol_'.$i]);
$q['sortOrder'] .= $info['sSortDir_'.$i];
}
}
$callqueue = self::getQueue($q); //Gets results with dependencies
$prospect_count = self::getCount(); //Gets total record count
$string = '{"sEcho": '.intval($_REQUEST['sEcho']).', "iTotalRecords": '.intval($prospect_count).', "iTotalDisplayRecords": '.(int)$prospect_count.', "aaData":[';
foreach ($callqueue as $c ) {
$locked = ($c['locked'] == 1)?'<input type="checkbox" checked disabled>':'<input type="checkbox" disabled>';
$scheduled_date = ($c['callback_date_time'])?date("M d Y g:ia", strtotime($c['callback_date_time'])):'';
if ($count != 0) $midstring .= "," ;
$midstring .= '["'.$c['priority'].'", "'.addslashes($locked).'", "'.$scheduled_date.'", "'.$c['company_name'].'", "'.$c['marcom_name'].'", "'.$c['marcom_description'].'"]';
$count++;
}
$endstring .= ']}';
$finalstring = $string.$midstring.$endstring;
return $finalstring;
}
这个工具是我们公司的游戏改变者,当我终于弄明白了。我们从(设计不当的)手动寻呼系统转向ajax呼叫和交互,这使用户体验发生了重大变化。在某种程度上,你通过查询和交互的间距“欺骗”用户......但它只是有效。
答案 1 :(得分:0)
我可以推荐以下方法来处理许多数据搜索。
当用户第一次发出搜索时,查询记录的ID,匹配他的所有过滤器。然后,每次需要呈现页面时,使用limit子句查询具有这些ID的记录的数据库。这将显着降低数据库负载,因为您不需要反复应用过滤器,只需按主键选择记录。