2011-08-26 3 views
1

Y at-il de toute façon d'optimiser la requête suivante:MySQL sous-requête SOMME() corrélée ORDER BY

SELECT 
    t1.id, 
    (SELECT SUM(col1) FROM table_name_two t2 WHERE t2.name LIKE CONCAT('%',t1.name)) AS col1_count 
FROM 
    table_name_one t1 
ORDER BY 
    col1_count DESC 

L'utilisation ORDER BY col1_count DESC prend beaucoup de temps.

Merci.

+1

SubQueries sont très lents, je ne les recommanderais pas. Pouvez-vous quitter ces tables? –

+0

Votre match wildcard va vous tuer. Un caractère générique à l'avant de la chaîne est incapable d'utiliser un index de sorte qu'il effectuera un balayage de table pour trouver chaque correspondance. Et il n'y a rien que vous puissiez faire pour le réparer si vous ne modifiez pas vos données pour mettre les parties correspondantes des chaînes sur le devant. – dkretz

+1

@ BookOfZeus: "SubQueries sont très lents" --- Je ne dirais jamais de cette façon. Il y a des cas où les sous-requêtes sont meilleures que les jointures. – zerkms

Répondre

2

juste faire une jointure normale avec votre comparaison dans la clause on rejoignons:

SELECT 
    t1.id, 
    SUM(t2.col1) AS col1_count 
FROM table_name_one t1 
LEFT JOIN table_name_two t2 on t2.name LIKE CONCAT('%', t1.name) 
GROUP BY 1 
ORDER BY 2 DESC 

Il devrait être façon plus rapide de cette façon - il est fondamentalement une requête au lieu de requêtes « n », même si elle a gagné » t obtenir de l'aide des index en utilisant l'opérateur LIKE avec un leader %