Vinzenz Mai: left join optimieren

Beitrag lesen

Hallo Joachim,

a     ALL  NULL          NULL NULL    NULL 6  Using where; Using temporary; Using filesort
b     ALL  PRIMARY       NULL NULL    NULL 3  Using where
c     ALL  NULL          NULL NULL    NULL 2

Sprich fuer a und c hat er keine possible_keys. Aber in diesen Tabellen muessen ja auch Übereinstimmungen gefunden werden, die nicht unique sein können:
a.article_author_id = b.id
^^^^^^^^^^^^^^^^^^^
a.id = c.comment_article_id
       ^^^^^^^^^^^^^^^^^^^^

diese Spalten solltest Du ebenfalls mit einem Index versehen :-)
Somit sollte der Optimierer in Tabelle a den Index der Spalte article_author_id finden und nutzen.

Welche MySQL-Version verwendest Du?

Schreibe mal die Query um:

SELECT  
    a.id,  
    a.article_title,  
    a.article_text,  
    a.article_author_id,  
    a.`date`,  
    b.email,  
    b.nick,  
    COUNT(c.comment_article_id)  
FROM table_b b  
INNER JOIN table_a a  
ON b.id = a.article_author_id  
LEFT JOIN c  
ON a.id = c.comment_article_id  
WHERE a.blog_name = 'blogname'  
GROUP BY  
    a.id,  
    a.article_title,  
    a.article_text,  
    a.article_author_id,  
    a.`date`,  
    b.email,  
    b.nick  
ORDER BY a.id DESC  
LIMIT 0, 10 

Indexe:
a.id PRIMARY KEY
a.article_author_id INDEX (nicht UNIQUE)

b.id PRIMARY KEY

c.comment_article_id INDEX (nicht UNIQUE

Beachte bitte, dass je Tabelle in einer Abfrage nur _ein_ Index genutzt werden kann. using filesort und using temporary ist beides schlecht, zusammen noch ungünstiger. Dort sollte man bei Optimierungen ansetzen.

Freundliche Grüße

Vinzenz