J'essaie de trouver des résultats d'examen pour les individuels entre plusieurs périodes en utilisant cette requête:Les mauvaises performances avec entre la requête
SELECT * FROM RESULTS AS R, Define_Times AS T
WHERE R.PERSONID = T.PERSONID AND (
(R.DATE BETWEEN T.Previous_Month_Start AND T.Previous_Month_End) OR
(R.DATE BETWEEN T.Next_Month_Start AND T.Next_Month_End) OR
(R.DATE BETWEEN T.Six_Month_Start AND T.Six_Month_End) OR
(R.DATE BETWEEN T.One_Year_Start AND T.One_Year_End) OR
(R.DATE BETWEEN T.Two_Year_Start AND T.Two_Year_End) OR
(R.DATE BETWEEN T.Three_Year_Start AND T.Three_Year_End) OR
(R.DATE BETWEEN T.Four_Year_Start AND T.Four_Year_End))
Précédent/Suivant/One_Year etc. est différent pour chaque personne.
donne Expliquer:
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
| 1 | SIMPLE | T | ALL | PEOPLE | NULL | NULL | NULL | 75775 | |
| 1 | SIMPLE | R | ref | IDX3,IDX2 | IDX3 | 5 | T.PERSONID | 3550 | Using where |
Le tableau de résultats a environ 300 millions de lignes. Define_Times a 75 000.
Ça prend de l'AGES.
Je vois que le 1er type est ALL, ce qui est mauvais. Mais si c'est si mauvais, pourquoi n'utilise-t-il pas l'index sur PERSONID (appelé PEOPLE) identifié comme possible? Que puis-je faire pour améliorer cela?
Je ne peux pas non plus le voir en utilisant un index pour la date - il y en a un sur R.DATE. (C'est le premier dans la séquence de 5 sur l'index appelé IDX2.)
Désolé pour toutes les fautes de frappe - mon clavier est cassé, et merci d'avance.
Avez-vous essayé de sélectionner les deux tables en utilisant 'join' à la place? – Amber
Cela utilise une jointure, juste une sémantique différente. –
Est-ce que chaque ligne de Define_Times a une personne correspondante dans Results? –