J'essaie de faire paginer Cakephp tirer parti de la fonction SQL_CALC_FOUND_ROWS dans mysql pour retourner le nombre total de lignes tout en utilisant LIMIT. Heureusement, cela peut éliminer la double requête de paginateCount(), puis paginate().cakephp paginate using mysql SQL_CALC_FOUND_ROWS
Je l'ai mis dans mon app_model.php, et il fonctionne essentiellement, mais il pourrait être mieux fait. Quelqu'un peut-il m'aider à comprendre comment remplacer paginate/paginateCount afin qu'il n'exécute que 1 SQL stmt?
/**
* Overridden paginateCount method, to using SQL_CALC_FOUND_ROWS
*/
public function paginateCount($conditions = null, $recursive = 0, $extra = array()) {
$options = array_merge(compact('conditions', 'recursive'), $extra);
$options['fields'] = "SQL_CALC_FOUND_ROWS `{$this->alias}`.*";
Q: comment obtenez-vous la valeur limite utilisée dans SAME paginate()? Q: pouvons-nous en quelque sorte obtenir les résultats de la requête à paginer directement, sans la requête supplémentaire?
$cache_results_from_paginateCount = $this->find('all', $options);
/*
* note: we must run the query to get the count, but it will be cached for multiple paginates, so add comment to query
*/
$found_rows = $this->query("/* do not cache for {$this->alias} */ SELECT FOUND_ROWS();");
$count = array_shift($found_rows[0][0]);
return $count;
}
/**
* Overridden paginate method
*/
public function paginate($conditions, $fields, $order, $limit, $page = 1, $recursive = null, $extra = array()) {
$options = array_merge(compact('conditions', 'fields', 'order', 'limit', 'page', 'recursive'), $extra);
Q: peut-on obtenir en quelque sorte $ cache_results_for_paginate directement à partir paginateCount()?
return $cache_results_from_paginateCount; // paginate in only 1 SQL stmt
return $this->find('all', $options); // ideally, we could skip this call entirely
}
Je veux simplement ajouter ici que SQL_CALC_FOUND_ROWS est souvent beaucoup, beaucoup plus lent que d'utiliser un droit COUNT(), et 2 requêtes. La raison en est que Mysql cherche les données. Surtout les grands ensembles de données, les solutions SQL_CALC_FOUND_ROWS peuvent prendre littéralement des millions de fois plus longtemps (100+ secondes contre 0,004 secondes sur un million d'enregistrements). – Oddman