|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Invité régulier
![]() Inscription : juillet 2011 Messages : 31 ![]() |
Bonjour à tous,
Je veux juste savoir si un enregistrement existe en fonction d'un critère. Quelle est la requête la plus performante ? Code :
SELECT COUNT(*) FROM matable WHERE ... Code :
SELECT id FROM matable WHERE ... LIMIT 1 |
|
|
00
|
|
|
#2 | ||
![]() ![]() |
Intéressante interrogation !
Ta seconde requête laisse supposer qu'il peut y avoir plusieurs id satisfaisant au critère. Je pense qu'avec cette seconde requête, le SGBD va d'abord extraire toutes les lignes satisfaisant au critère puis limiter le jeu de résultat à la première ligne. La première requête va compter le nombre de lignes satisfaisant le critère. Il est possible que l'opération de comptage ajoute du temps par rapport à la première requête. Encore que si le critère est basé sur un index, peut-être que le comptage se fait directement sur l'index sans extraire les informations des lignes ? Il faudrait un spécialiste de la mécanique de MySQL pour répondre. Bien sûr, la différence ne se fera sentir qu'avec un grand nombre de lignes dans la table. L'idéal serait peut-être une requête de ce genre : Code :
Mais je ne suis pas sûr qu'elle soit syntaxiquement valide.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework... « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau) À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française ! Linuxiens, comptez-vous ! |
||
|
00
|
|
|
#3 | |
|
Expert Confirmé
![]() Inscription : mai 2002 Messages : 1 648 ![]() |
Bonjour,
Citation:
Sans ORDER BY il devrait sortir dès qu'il satisfait sa condition au vu de son scan de table. En fait c'est un peu le même problème qu'ici : http://www.developpez.net/forums/d11...ation-requete/ Mais vu qu'on a pas eu les EXPLAIN c'est difficile de se pronnoncer (car 2sec pour scanner à l'envers un index c'est beaucoup je trouve...) |
|
|
|
00
|
|
|
#4 | |||
|
Expert Confirmé
![]() ![]() Avcxjo MoKoRetraité Inscription : novembre 2005 Messages : 2 530 ![]() |
Citation:
Code :
SELECT CASE WHEN EXISTS(SELECT DEBIT FROM JOURNAUX WHERE DEBIT=167.35) THEN "TROUVE" ELSE "PAS TROUVE" END
__________________
Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof articles : Comment émuler un tableau croisé [quasi] dynamique et : Une énigme mathématique résolue avec MySQL recommande l'utilisation de PDO (PHP5 Data Objects) |
|||
|
00
|
|
|
#5 | |||
|
Membre Expert
![]() Inscription : août 2008 Messages : 1 271 ![]() |
Comment MySQL optimise LIMIT
Moi je vote pour la requête avec LIMIT. Ou sinon comme ça avec DUAL: Citation:
Code :
|
|||
|
|
10
|
|
|
#6 |
|
Membre du Club
![]() Frédéric Inscription : juin 2011 Messages : 52 ![]() |
Bonjour,
J'ai fait quelques tests sur des tables INNODB et MYISAM avec des critères de recherche différents. Dans tous les cas que j'ai testé, la requête avec LIMIT est soit beaucoup plus rapide soit identique au SELECT count(*). Je n'ai pas vu d’amélioration en utilisant le "SELECT EXISTS" |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com