我公司的应用程序处理超过 200 万条记录和大量连接,我们使用 jQuery DataTables 非常优雅地处理了这个确切的问题。是的,这就是前端技术……但是用户、数据表和我们的查询之间的交互使它成为一个非常优雅的解决方案。除了为表建立索引之外,我们根本不做任何视图或存储过程,而且它适合 zippy。
DataTables 是一个网格——一个具有额外功能的表格,包括排序、分页、过滤等。它通过 Ajax、X 一次抓取数据,并向查询添加额外元素以实现额外功能。它真正闪耀的地方是当您使用称为“管道”的功能时,它会在您显示的内容之前和之后抓取数据,从而减少查询量,同时为用户提供更快的查看体验。它是一个内置功能,非常易于部署。
这是关于流水线的 tut: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 调用和交互性,这对用户体验产生了影响。在某种程度上,您通过查询和交互的间距“欺骗”了用户......但它确实有效。