Pouvez-vous l'indice des sous-requêtes?

J'ai une table et une requête qui ressemble à ci-dessous. Pour un exemple, voir ce SQL Violon.

SELECT o.property_B, SUM(o.score1), w.score
FROM o
INNER JOIN 
(
    SELECT o.property_B, SUM(o.score2) AS score FROM o GROUP BY property_B
) w ON w.property_B = o.property_B
WHERE o.property_A = 'specific_A'
GROUP BY property_B;

Avec mes données réelles, cette requête est de 27 secondes. Cependant, si j'ai d'abord créer w, à titre temporaire, des tables et des index property_B, l'ensemble prend environ 1 seconde.

CREATE TEMPORARY TABLE w AS
SELECT o.property_B, SUM(o.score2) AS score FROM o GROUP BY property_B;

ALTER TABLE w ADD INDEX `property_B_idx` (property_B);

SELECT o.property_B, SUM(o.score1), w.score
FROM o
INNER JOIN w ON w.property_B = o.property_B
WHERE o.property_A = 'specific_A'
GROUP BY property_B;

DROP TABLE IF EXISTS w;

Est-il un moyen de combiner le meilleur de ces deux requêtes? I. e. une seule requête avec la vitesse avantages de l'indexation de la sous-requête?

MODIFIER

Après Mehran la réponse ci-dessous, j'ai lu cette pièce de l'explication dans le Documentation de MySQL:

MySQL 5.6.3, l'optimiseur de manière plus efficace les poignées de sous-requêtes dans la clause from (qui est, les tables dérivées):

...

Pour les cas de matérialisation est nécessaire pour une sous-requête dans la clause from, l'optimiseur peut accélérer l'accès au résultat par l'ajout d'un index à l'matérialisé table. Si un tel indice permettrait ref accès à la table, il peut réduire considérablement la quantité de données qui doit être lu lors de l'exécution de la requête. Considérons la requête suivante:

SELECT * FROM t1
  JOIN (SELECT * FROM t2) AS derived_t2 ON t1.f1=derived_t2.f1;

L'optimiseur construit un index sur la colonne de f1 à partir de derived_t2 si c'était de permettre l'utilisation de réf accès pour le plus bas coût de plan d'exécution. Après l'ajout de l'index, l'optimiseur peut traiter la matérialisés provenant de la table de la même chose que d'une table avec un index, et il bénéficie de la même manière à partir de l'index généré. Les frais généraux de la création d'index est négligeable par rapport au coût de l'exécution de la requête sans l'index. Si ref accès entraîne un coût plus élevé que certains autres de la méthode d'accès, pas d'index est créé et l'optimiseur ne perd rien.

Je suppose property_B est répertorié dans la table source o? Ce n'EXPLIQUEZ vous montrer?
En effet, property_B est répertorié dans la Table source. o. EXPLIQUEZ me dit qu'aucun indice est utilisé pour calculer la JOINTURE INTERNE ( .... ) w .... Je veux changer ma requête telle que l'utilisation (temporaire?) index.
Vous n'avez pas d'agrégation des fonctions (dans l'exemple affiché ci-dessus). Tout ceci est un non-sens. Aussi, il est peu probable que vous voulez un type de données FLOAT ici (en coulisse). Changer en DÉCIMAL.
...et où des expressions comme int(8) et int(11) vient-il? Le nombre entre parenthèses est (presque) pas pertinent
Merci de remarquer que j'ai manqué la SOMME(..) la fonction ci-dessus. Ils étaient présents dans le SQL de Violon. Je ne vois pas comment discuter sur le FLOTTEUR vs DÉCIMAL ou les numéros entre parenthèses sont pertinents pour cette question, pouvez-vous développer?

OriginalL'auteur physicalattraction | 2014-11-20