Quantcast
Channel: Recent Discussions — DataTables forums
Viewing all articles
Browse latest Browse all 82109

DataTables with large number of rows

$
0
0
I've been using DataTables for quite some time now on small tables with <1000 rows, but now I have a table with 16K rows and it takes about 45 - 60 seconds to load the page. I'm looking at using server-side processing, hoping that would make it load faster but I'm having dfficulty making the examples work for me.
$(document).ready(function() {
    $('#example').dataTable( {
    "bProcessing": true,
    "bServerSide": true,
    "sAjaxSource": "/cmdb/server_processing.php"
} );

It doesn't even appear to be caling the script. I put some debug type lines to see if it was calling the script. I used the PHP script that I found on the DataTable site for server-side processing and made the necessary changes. It doesn't appear to be bringing back the data.

<?php
	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
	 * Easy set variables
	 */
	include('constants.php');
    include('common.inc.php');
    include('db.conf.php');
    include('ez_sql_core.php');
    include('ez_sql_mysql.php');
    PrintLog("Called server_processing.php");
	
	/* Array of database columns which should be read and sent back to DataTables. Use a space where
	 * you want to insert a non-database field (for example a counter or static image)
	 */
	//$aColumns = array( 'engine', 'browser', 'platform', 'version', 'grade' );
	$aColumns = array('hostname',' primary_cap', 'serial_no', 'status', 'env_spec', 'cust_code', 'lid_code', 'cust_region');
	
	/* Indexed column (used for fast and accurate table cardinality) */
	$sIndexColumn = "hostname";
	
	/* DB table to use */
	$sTable = "consolidated_ci_hw";
	
	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
	 * If you just want to use the basic configuration for DataTables with PHP server-side, there is
	 * no need to edit below this line
	 */
	
	/* 
	 * MySQL connection
	 */
	
    
    /* Database connection information */
	$gaSql['user']       = $cfg['cap_cmdb2']['username'];
	$gaSql['password']   = $cfg['cap_cmdb2']['password'];
	$gaSql['db']         = $cfg['cap_cmdb2']['database'];
	$gaSql['server']     = $cfg['cap_cmdb2']['hostspec'];

	$gaSql['link'] =  mysql_pconnect( $gaSql['server'], $gaSql['user'], $gaSql['password']  ) or
		die( 'Could not open connection to server' );
	
	mysql_select_db( $gaSql['db'], $gaSql['link'] ) or 
		die( 'Could not select database '. $gaSql['db'] );

	
	/* 
	 * Paging
	 */
	$sLimit = "";
	if (isset( $_GET['iDisplayStart'] ) && $_GET['iDisplayLength'] != '-1') {
		$sLimit = "LIMIT ".intval( $_GET['iDisplayStart'] ).", ".
			intval( $_GET['iDisplayLength'] );
	}
	
	
	/*
	 * Ordering
	 */
	$sOrder = "";
	if (isset( $_GET['iSortCol_0'])) {
		$sOrder = "ORDER BY  ";
		for ( $i=0 ; $i<intval( $_GET['iSortingCols'] ) ; $i++ ) {
			if ( $_GET[ 'bSortable_' . intval($_GET['iSortCol_' . $i]) ] == "true" ) {
				$sOrder .= "`" . $aColumns[ intval( $_GET['iSortCol_' . $i] ) ] . "` ".
					($_GET['sSortDir_' . $i]==='asc' ? 'asc' : 'desc') . ", ";
			}
		}
		
		$sOrder = substr_replace( $sOrder, "", -2 );
		if ( $sOrder == "ORDER BY" ) {
			$sOrder = "";
		}
	}
	
	
	/* 
	 * Filtering
	 * NOTE this does not match the built-in DataTables filtering which does it
	 * word by word on any field. It's possible to do here, but concerned about efficiency
	 * on very large tables, and MySQL's regex functionality is very limited
	 */
	$sWhere = "";
	if ( isset($_GET['sSearch']) && $_GET['sSearch'] != "" ) {
		$sWhere = "WHERE (";
		for ( $i=0 ; $i<count($aColumns) ; $i++ ) {
			$sWhere .= "`" . $aColumns[$i] . "` LIKE '%" . mysql_real_escape_string( $_GET['sSearch'] ) . "%' OR ";
		}
		$sWhere = substr_replace( $sWhere, "", -3 );
		$sWhere .= ')';
	}
	
	/* Individual column filtering */
	for ( $i=0 ; $i<count($aColumns) ; $i++ ) {
		if ( isset($_GET['bSearchable_' . $i]) && $_GET['bSearchable_' . $i] == "true" && $_GET['sSearch_' . $i] != '' ) {
			if ( $sWhere == "" ) {
				$sWhere = "WHERE ";
			} else {
				$sWhere .= " AND ";
			}
			$sWhere .= "`" . $aColumns[$i] . "` LIKE '%" . mysql_real_escape_string($_GET['sSearch_' . $i]) . "%' ";
		}
	}
	
	
	/*
	 * SQL queries
	 * Get data to display
	 */
	$sQuery = "
		SELECT SQL_CALC_FOUND_ROWS `" . str_replace(" , ", " ", implode("`, `", $aColumns))."`
		FROM   $sTable
		$sWhere
		$sOrder
		$sLimit
		";
	$rResult = mysql_query( $sQuery, $gaSql['link'] ) or die(mysql_error());
	
	/* Data set length after filtering */
	$sQuery = "
		SELECT FOUND_ROWS()
	";
	$rResultFilterTotal = mysql_query( $sQuery, $gaSql['link'] ) or die(mysql_error());
	$aResultFilterTotal = mysql_fetch_array($rResultFilterTotal);
	$iFilteredTotal = $aResultFilterTotal[0];
	
	/* Total data set length */
	$sQuery = "
		SELECT COUNT(`".$sIndexColumn."`)
		FROM   $sTable
	";
	$rResultTotal = mysql_query( $sQuery, $gaSql['link'] ) or die(mysql_error());
	$aResultTotal = mysql_fetch_array($rResultTotal);
	$iTotal = $aResultTotal[0];
	
	
	/*
	 * Output
	 */
	$output = array(
		"sEcho" => intval($_GET['sEcho']),
		"iTotalRecords" => $iTotal,
		"iTotalDisplayRecords" => $iFilteredTotal,
		"aaData" => array()
	);
	
	while ( $aRow = mysql_fetch_array( $rResult ) ) {
		$row = array();
		for ( $i=0 ; $i<count($aColumns) ; $i++ ) {
			if ( $aColumns[$i] == "version" ) {
				/* Special output formatting for 'version' column */
				$row[] = ($aRow[ $aColumns[$i] ]=="0") ? '-' : $aRow[ $aColumns[$i] ];
			} else if ( $aColumns[$i] != ' ' ) {
				/* General output */
				$row[] = $aRow[ $aColumns[$i] ];
			}
		}
		$output['aaData'][] = $row;
	}
	
	echo json_encode( $output );
?>
In the main script, does JQuery take care of loading the rows or how do I present each row/column of data that would come back?

<table cellpadding="0" cellspacing="0" border="0" class="display" id="example">
	                        <thead>
		                        <tr>
		                            <th>Server Name</th>
		                            <th>Asset Type</th>
		                            <th>Serial #</th>
		                            <th>Asset Status</th>
		                            <th>Environment</th>
		                            <th>Cust Code</th>
		                            <th>LID Code</th>
		                            <th>Cust Region</th>
		                        </tr>
	                        </thead>
	                        <tbody>
	                        	<tr>
			                        <td colspan="8" class="dataTables_empty">Loading data from server</td>
		                        </tr>
	                        </tbody>
	                        <tfoot>
		                        <tr>
		                            <th>Server Name</th>
		                            <th>Asset Type</th>
		                            <th>Serial #</th>
		                            <th>Asset Status</th>
		                            <th>Environment</th>
		                            <th>Cust Code</th>
		                            <th>LID Code</th>
		                            <th>Cust Region</th>
		                        </tr>
	                        </tfoot>
	            
                        </table>
All I see is "Loading data from server" and no data.

Viewing all articles
Browse latest Browse all 82109

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>