Laquelle de ces 2 requêtes est la plus rapide ?

VaN
Mammouth du PHP | 1107 Messages

09 déc. 2008, 14:10

Bonjour,

pour récupérer une valeur dans ma base de données, j'ai à priori 2 choix :
$annonce_id = getValueFromQuery(sprintf("SELECT annonce_id FROM ".$cfg_prefixe."annonces WHERE annonce_user_id = '%s' ORDER BY annonce_datetime DESC LIMIT 1", 
			mysql_real_escape_string($user_id)));
ou
$annonce_id = getValueFromQuery(sprintf("SELECT MAX(annonce_id) as annonce_id FROM ".$cfg_prefixe."annonces WHERE annonce_user_id = '%s'", 
			mysql_real_escape_string($user_id)));
Ces deux requêtes devraient théoriquement me retourner la même chose, puisque le champ annonce_datetime est rempli via un date('Y-m-d H:i:s') au moment de l'insertion.

Mais j'aimerai savoir laquelle de ces deux requêtes est la plus rapide. Je pencherai pour celle avec une LIMIT, puisqu'elle ne scan qu'une seule entrée, mais je me trompes peut-etre.

Voila la structure de la table :
CREATE TABLE `annonces` (
`annonce_id` int(11) NOT NULL auto_increment,
`annonce_user_id` int(11) NOT NULL,
`annonce_datetime` datetime NOT NULL,
`annonce_statut` tinyint(4) NOT NULL,
`annonce_position` tinyint(4) NOT NULL,
`annonce_views` int(11) NOT NULL,
`annonce_type` enum('vente','location') NOT NULL,
`annonce_type_bien` enum('appartement','maison') NOT NULL,
`annonce_address` text NOT NULL,
`annonce_zipcode` varchar(10) NOT NULL,
`annonce_city` text NOT NULL,
`annonce_country` int(11) NOT NULL,
`annonce_surface` float NOT NULL,
`annonce_rooms` int(11) NOT NULL,
`annonce_price` float NOT NULL,
`annonce_description` text NOT NULL,
`annonce_old_price` float NOT NULL,
PRIMARY KEY (`annonce_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=12 ;

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

09 déc. 2008, 15:01

Bonjour,

A priori, instinctivement je dirai que ça revient exactement au même...

Pour en avoir le coeur net, il faut faire le test.
Voici ci-dessous, le code PHP pour mesurer la durée d'exécution d'un script. Pour que ta mesure soit la plus juste possible, il faut que tu effectues plusieurs fois le test et que tu prennes la moyenne de tes résultats.
<?php
$time_start = microtime(true);

// Là tu mets ton code PHP à exécuter

$time_end = microtime(true);
$time = $time_end - $time_start;

print "Exécuté en ".$time." secondes";
?>
Quand tout le reste a échoué, lisez le mode d'emploi...

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

09 déc. 2008, 15:47

De plus, un petit EXPLAIN de chaque requête pour savoir comment il serait possible de l'optimiser.
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

ViPHP
AB
ViPHP | 5818 Messages

09 déc. 2008, 16:35

Pas mieux que les deux messages précédents.
Juste une précision sur les bench : il va sans dire qu'ils seront d'autant plus significatifs que les tests s'effectueront sur un grand nombre d'enregistrements. D'où l'intérêt de se préparer des tables de grande taille prévues à cet effet.