Page 1 sur 1

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

Posté : 09 déc. 2008, 14:10
par VaN
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 ;

Posté : 09 déc. 2008, 15:01
par @rthur
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";
?>

Posté : 09 déc. 2008, 15:47
par zeus
De plus, un petit EXPLAIN de chaque requête pour savoir comment il serait possible de l'optimiser.

Posté : 09 déc. 2008, 16:35
par AB
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.