Optimisation avec LEFT JOIN + filtrage EXISTS SELECT JOIN
Bonjour à tous,
J'aimerai optimiser un requête qui me permet à la base de faire un filtrage par une réponse d'existence (ou d'appartenance) dans une autre table avec comme données mis en comparaison un champ reçu d'un left join et un champ du select sur un exists.
Dis comme ça, c'est pas clair... mais voici cette sql qui malheureusement prends trop de temps d’exécution quand il y a beaucoup d'entrées dans les tables :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| SELECT
DISTINCT(nl.`id_news`),
n.*,
nl.*,
LEFT(nl.`title`, 120) as title,
(
SELECT count(cn.`id_commentnews`)
FROM `table_commentnews` cn
WHERE cn.`news` = n.`id_news`
AND cn.`actif` = 1
) as count_comments,
n.`id_news` as `id`
FROM `table_news_lang` nl
LEFT JOIN `table_news` n
ON (n.`id_news` = nl.`id_news`)
LEFT JOIN `table_correspondancecategorie` cc
ON (n.`id_news` = cc.`news`)
WHERE 1=1
AND
EXISTS (
SELECT 1
FROM `table_categorie` pc
JOIN `table_categorie_group` pcg
ON (pc.`id_categorie` = pcg.`id_categorie` AND pcg.`id_group` = 1)
WHERE cc.`categorie` = pc.`id_categorie`
)
AND n.`id_shop` = 1
AND nl.`id_lang` = 1
AND n.`actif` = 1
AND nl.`actif_langue` = 1
AND TIMESTAMP(n.`date`) <= '2017-08-23 11:04:09'
ORDER BY n.`date` desc
LIMIT 240, 10; |
Lors de mes tests, la sql est ultra rapide quand j'enlève la référence : WHERE cc.`categorie` = pc.`id_categorie`
En fait, je suppose que cc.`categorie` est lourde à mettre en valeur depuis le left join initial.
Merci pour votre aide