[MYSQL] Abfrage Optimieren

M

misterbasti

Hallo allerseits!
Ich bin gerade dabei eine MySql Abfrage zu optimieren und habe da ein kleines Problemchen.

Ich habe folgende Abfrage:
SQL:
SELECT 
    `np`.`id`, `np`.`published`, `np`.`modified`, 
    `np`.`comments`, `np`.`title`, `np`.`description`, 
    GROUP_CONCAT(DISTINCT `nc`.`name` SEPARATOR ','), 
    GROUP_CONCAT(DISTINCT `nu`.`real_name` SEPARATOR ',') 
FROM `naitis_posts` AS `np` 
INNER JOIN `naitis_relationships` AS `nr` 
    ON (`nr`.`type` = 1 AND `nr`.`first_object_id` = `np`.`id`) 
INNER JOIN `naitis_categories` AS `nc` 
    ON(`nc`.`id` = `nr`.`second_object_id`) 
INNER JOIN `naitis_user` AS `nu` 
    ON(`nu`.`id` = `np`.`author` OR `nu`.`id` = `np`.`editor`) 
WHERE `np`.`status` = 1 AND `np`.`published` <= NOW() 
GROUP BY `np`.`id` ORDER BY `np`.`published`, `np`.`modified` DESC LIMIT ?, ?

Der Explain - Select bringt mir folgendes Ergebnis für die letzte Tabelle (`nu`):
Code:
+-------------+-------+------+---------------+------+---------+------+------+
| select_type | table | type | possible_keys | key  | key_len | ref  | rows |
+-------------+-------+------+---------------+------+---------+------+------+
| SIMPLE      | nu    | ALL  | PRIMARY       | NULL | NULL    | NULL | 13   |
+-------------+-------+------+---------------+------+---------+------+------+

MySql mach in der letzten Tabelle also einen kompletten Tabellenscan,
obwohl mir folgende Abfrage,
SQL:
SELECT GROUP_CONCAT( `real_name` )
FROM `naitis_user`
WHERE `id` = 1 OR `id` = 2
die ja eig. gleichwertig zum oberen Join ist, folgendes Ergebnis liefert:
Code:
+-------------+-------+-------+---------------+---------+---------+------+------+
| select_type | table | type  | possible_keys | key     | key_len | ref  | rows |
+-------------+-------+-------+---------------+---------+---------+------+------+
| SIMPLE      | ..    | range | PRIMARY       | PRIMARY | 3       | NULL | 2    |
+-------------+-------+-------+---------------+---------+---------+------+------+

Naja, ist schon eine Weile her, da sind meine MySql Kentnisse ein wenig eingerostet. :p
Meine Fragen an euch sind nun:
Warum ist das so?
Und wie bekomme ich es jetzt hin,
dass die letzte Tabelle nicht komplett gescannt wird?

Ich hatte schon versucht mit FORCE bzw. USE INDEX das nutzen des Primärschlüssels
zu erzwingen, was aber trotzdem zum selben Ergebnis führte.

Ich freue mich auf eure Antworten. :)
 
Zuletzt bearbeitet von einem Moderator:
Wenn ich mich nich irre, machst du ein Group BY auf "np". Kann mich jetzt irren, wäre aber das Group By nicht auf das "nu" zu setzen
 
Die Gruppierung bezieht sich auf die Id des jeweiligen Beitrages, das ist schon richtig so. ^^
Eine Gruppierung der User würde hier aber keinen Sinn machen.

Aber trotzdem danke. :)
 
Zurück