Bonjour à tous,
Je veux juste savoir si un enregistrement existe en fonction d'un critère. Quelle est la requête la plus performante ?
ouCode:SELECT COUNT(*) FROM matable WHERE ...
ou autre ?Code:SELECT id FROM matable WHERE ... LIMIT 1
Version imprimable
Bonjour à tous,
Je veux juste savoir si un enregistrement existe en fonction d'un critère. Quelle est la requête la plus performante ?
ouCode:SELECT COUNT(*) FROM matable WHERE ...
ou autre ?Code:SELECT id FROM matable WHERE ... LIMIT 1
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 :
Elle devrait s'arrêter à la première ligne trouvée satisfaisant le critère.Code:
1
2
3
4
5 SELECT EXISTS ( SELECT * FROM matable WHERE critere )
Mais je ne suis pas sûr qu'elle soit syntaxiquement valide.
Bonjour,
C'est horrible s'il fait ca.Citation:
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.
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...)
Comment MySQL optimise LIMIT
Moi je vote pour la requête avec LIMIT.
Ou sinon comme ça avec DUAL:
Citation:
You are permitted to specify DUAL as a dummy table name in situations where no tables are referenced:
mysql> SELECT 1 + 1 FROM DUAL;
-> 2
Code:
1
2
3
4 SELECT 1 from dual where EXISTS (SELECT * FROM matable WHERE critere)
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"