J'ai une grande table (TokenFrequency) qui contient des millions de lignes. Le tableau de TokenFrequency qui est structuré comme suit:SQL Alternative à l'exécution d'un INNER JOIN sur une seule table
Tableau - TokenFrequency
- id - int, clé primaire la source
- - int, clé étrangère
- jeton - comte carboniser
- - int
Mon objectif est de sélectionner toutes les lignes dans lesquelles deux sources ont le même jeton. Par exemple, si ma table ressemblait à ceci:
id --- Source --- --- jeton compte
1 ------ 1 chien --------- - ----- 1
2 ------ 2 --------- cat -------- 2
3 ------ 3 ----- ---- cat -------- 2
4 ------ 4 --------- cochon -------- 5
5 ---- - 5 --------- zoo ------- 1
6 ------ 5 --------- cat -------- 1
7 ------ 5 --------- porc -------- 1
Je voudrais qu'une requête SQL me donne la source 1, la source 2, et la somme des comptes. Par exemple:
source1 --- --- source2 jeton --- compte
---- 2 ----------- 3 --------- chat -------- 4
---- 2 ----------- 5 --------- cat -------- 3
---- 3 ----------- 5 --------- cat -------- 3
---- 4 ------- ---- 5 -------- --------- porc 6
J'ai une requête qui ressemble à ceci:
SELECT F.source AS source1, S.source AS source2, F.token,
(F.count + S.count) AS sum
FROM TokenFrequency F
INNER JOIN TokenFrequency S ON F.token = S.token
WHERE F.source <> S.source
Cette requête fonctionne très bien, mais les problèmes que j'ai avec ce sont que:
- J'ai une table de TokenFrequency qui a des millions de lignes et donc besoin d'une alternative plus rapide pour obtenir ce résultat.
- La requête en cours que j'ai est de donner des doublons. Par exemple sa sélection:
source1 = 2, source2 = 3, jeton = chat, count = 4
source1 = 3, source2 = 2, jeton = chat, count = 4
Ce qui est pas trop d'un problème mais s'il y a un moyen d'éliminer ceux-ci et d'obtenir une augmentation de vitesse alors il serait très utile
Le principal problème que j'ai est la vitesse de la requête avec ma requête actuelle, il faut des heures pour terminer. Le INNER JOIN sur une table à lui-même est ce que je crois être le problème. Je suis sûr qu'il doit y avoir un moyen d'éliminer la jointure interne et obtenir des résultats similaires en utilisant une seule instance de la table TokenFrequency. Le deuxième problème que j'ai mentionné pourrait également favoriser une augmentation de la vitesse dans la requête.
J'ai besoin d'un moyen de restructurer cette requête pour fournir les mêmes résultats de manière plus rapide et plus efficace.
Merci.
Pouvez-vous publier l'EXPLAIN de la requête (http://dev.mysql.com/doc/refman/5.0/en/explain.html). Cela aidera les gens à voir comment ils peuvent vous aider à optimiser. –
vous devez donner quelques informations d'index, quelles colonnes, etc. –
Voici mon EXPLAIN de la requête que j'ai initialement publiée. id: 1, select_type: SIMPLE, table: F & S, tapez: ALL, touches possibles: NULL, clé: NULL, Key_len: NULL, réf: NULL, lignes: 8, Extra: Using where; Utilisation du tampon de jointure Deux lignes sont renvoyées. La seule différence réside dans les deux noms de tables F et S. – cruzja