Je mets en place une liste de comptes clients que l'on peut rechercher avec le plugin autocomplete de Jquery. Jusque là tout va bien, l'autocompletion fonctionne nickel.
Sauf que durant mes tests préliminaires, j'utilisais une base de données forte de 300 entrées max. Maintenant que je fais le test à grande échelle avec une base de données de 65000 entrées, la page met 40-60 secondes à se charger rien que pour l'autocompletion (j'ai essayé de charger la page sans le plugin et c'est presque instantané). Je cherche donc à optimiser l'appel d'autocomplete.
Du coup voici ma méthode actuelle qui rame:
Je suis sous zend, j'appelle dans le controller l'autocomplete et la fonction qui va lui donner sa base de données.
Code : Tout sélectionner
$liste_noclients = Business_Pilotage_Service::factory($this->_adpater)->listerNoclient();
$this->view->autocompleteElement = new ZendX_JQuery_Form_Element_AutoComplete('autoComplete');
$this->view->autocompleteElement->setJQueryParam('data', $liste_noclients)
->setJQueryParams( array("change" => new Zend_Json_Expr("function() { $('#form_autocomplete').submit(); }") ) )
->setAttrib('size',10,10,10)
->setAttrib('limit',10)
->setJQueryParam('minLength',5);Code : Tout sélectionner
public function listerNoclient()
{
// Connexion
$dbConn = new PDO($this->_dsn, $this->_username, $this->_password);
// Preparation de le requete
$pdoStmt = $dbConn->prepare('SELECT NO_CLI_VPC FROM VCCLICGP WHERE DT_SUP IS NULL ORDER BY NO_CLI_VPC');
// Execution de la requete
$pdoStmt->execute();
$res = $pdoStmt->fetchAll();
$resnoclient = array();
$i = 0;
foreach($res as $liste){
$resnoclient[$i] = $liste['NO_CLI_VPC'];
$i++;
}
// Fermeture connexion
$dbConn = null;
return $resnoclient;
}Code : Tout sélectionner
Array
(
[0] => Array
(
[NO_CLI_VPC] => V000001
[0] => V000001
)
[1] => Array
(
[NO_CLI_VPC] => V000002
[0] => V000002
)
[2] => Array
(
[NO_CLI_VPC] => V000003
[0] => V000003
)
...Code : Tout sélectionner
Array
(
[0] => V000001
[1] => V000002
[2] => V000003
[3] => V000004
[4] => V000005
[5] => V000006
[6] => V000007
[7] => V000008
[8] => V000009
[9] => V000010
[10] => V000011
[11] => V000012
...Si ce n'était que le premier chargement, mais l'utilisateur se tape un chargement à la validation du coup la recherche est plutôt lente (disons qu'on doit rechercher 3 clients pour les modifier ça nous prend 3 minutes à poireauter pour 5 secondes d'action).
Est-il possible de passer la base directement en paramètre d'autocomplete?
J'entends par là, à partir de 5 caractères entrés, autocomplete va faire un "SELECT V0000* FROM..." et n'avoir en mémoire que les 100 valeurs possibles plutôt que les 65000 qui ne servent à rien.
J'ai bien vu la doc qui me parle de 'remote source' et de bases de données avec des millions d'entrées mais je ne trouve rien d'autre à ce sujet, pas même un exemple. Du coup si vous avez une solution / un lien vers une explication, je serais fort joie de vous voir participer.
En vous remerciant,
--Simon