SELECT
DISTINCT *
FROM
posts s
JOIN
budy f ON s.userid = f.fid AND s.time >= f.f_since OR s.userid='$thisid'
WHERE
f.myid='$thisid'
GROUP BY
s.pid DESC
LIMIT 20
En regardant votre requête, je pense que votre JOIN est le coupable. Je n'ai jamais vu de syntaxe de jointure avec des conditions booléennes attachées, donc je ne suis pas exactement sûr de la façon dont il va se comporter sans le tester directement sur mysql.
pensées évidentes:
- est posts.userid indexé?
- est f.fid indexé?
- qu'en est-il de posts.time et de budy.f_since?
- vos options AND et OR sur l'instruction de jointure nécessitent-elles des parenthèses?
Avez-vous essayé de réécrire la requête pour voir si votre temps peut être amélioré? Peut-être que cela pourrait faire une différence:
SELECT
DISTINCT *
FROM
posts s
JOIN
budy f ON s.userid = f.fid
WHERE
s.userid='$thisid'
s.time >= f.f_since
GROUP BY
s.pid DESC
LIMIT 20
Puisque je ne suis pas sûr de ce que les données sont dans vos tables et ce que vous attendez de voir la suite de vos jointures, je ne peux pas être sûr que ma requête correspondre à la vôtre. Vous devez d'abord les vérifier. Aussi, n'oubliez pas d'utiliser la commande EXPLAIN pour savoir ce que mysql veut faire avec votre requête.
Veuillez ajouter quelques informations supplémentaires telles que les requêtes/requêtes exactes que vous utilisez; le code Ajax et PHP; ce que vous faites et quel est exactement le goulot d'étranglement qui le rend si lent. –
les requêtes s'exécutent généralement rapidement ... êtes-vous sûr que le problème est dans la requête? ... peut-être que vous faites quelque chose après la requête qui le rend lent ... – Reigel
s'il y avait un moyen spécial de faire la requête rapide , je suis sûr que le SGBD aurait déjà fait cette manière spéciale comme la manière standard :) –