« MySQL/Requêtes » : différence entre les versions

Contenu supprimé Contenu ajouté
→‎Index : Déplacement dans MySQL/Optimisation
Ligne 237 :
FROM wiki1_page
WHERE page_id = ALL (SELECT pp_page FROM wiki1_page_props WHERE pp_propname = 'defaultsort');
</source>
 
=== Hints d'optimisation ===
L'ordre des mots réservés est important si on applique plusieurs {{w|Hint (SQL)|hints}}<ref>http://dev.mysql.com/doc/refman/5.7/en/index-hints.html</ref> :
<source lang=sql>
SELECT [ALL | DISTINCT | DISTINCTROW ]
[HIGH_PRIORITY] [STRAIGHT_JOIN]
[SQL_SMALL_RESULT | SQL_BIG_RESULT] [SQL_BUFFER_RESULT]
[SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS]
...
</source>
 
==== HIGH_PRIORITY ====
Généralement les commandes LMD (<code>INSERT, DELETE, UPDATE</code>) sont prioritaires sur le <code>SELECT</code>. Mais grâce à <code>HIGH_PRIORITY</code> un <code>SELECT</code> peut être traité avec elles.
 
==== STRAIGHT_JOIN ====
Force MySQL à évaluer les tables d'un <code>JOIN</code> dans l'ordre où elles sont nommées (de gauche à droite).
 
==== SQL_SMALL_RESULT ====
Lors d'un <code>DISTINCT<code> ou d'un <code>GROUP BY</code>, ce hint prévient l'optimiseur que la requête va renvoyer un petit nombre de lignes.
 
==== SQL_BIG_RESULT ====
Lors d'un <code>DISTINCT<code> ou d'un <code>GROUP BY</code>, dit à l'optimiseur que la requête renvoie un nombre élevé de résultats.
 
==== SQL_BUFFER_RESULT ====
Force MySQL à copier le résultat dans une table temporaire. Cela peut s'avérer utile par exemple pour supprimer des <code>LOCK</code> rapidement.
 
==== SQL_CACHE ====
Force MySQL à copier le résultat dans le cache. Ne fonctionne que si la valeur de <code>query_cache_type</code> est <code>DEMAND</code> ou 2.
 
==== SQL_NO_CACHE ====
Demande à MySQL de ne pas mettre le résultat en cache. C'est utile quand la requête survient très rarement, ou que le résultat change très souvent.
 
==== SQL_CALC_FOUND_ROWS ====
Si une requête contient <code>LIMIT</code>, ce hint dit au serveur de calculer combien de lignes auraient été retournées en cas d'absence de <code>LIMIT</code>. Pour récupérer le nombre il faut sélectionner <code>FOUND_ROWS()</code>.
<source lang=sql>
SELECT SQL_CALC_FOUND_ROWS * FROM `wiki1_page` LIMIT 2 OFFSET 100;
SELECT FOUND_ROWS();
</source>