Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL-Abfrage optimieren:Zu langsam beim Bestellen

Anstatt den Order By zu platzieren in die Hauptabfrage, packen Sie es wie folgt ein:

SELECT * FROM (   
  ... your query
) ORDER BY `created at`

Sehen Sie sich den Abfrageplan an. Sie werden feststellen, dass in Ihrem Fall die Sortierung für Ihre Tabelle mtrt_items durchgeführt wird bevor der äußere Join ausgeführt wird. In der Umschreibung, die ich teilweise bereitgestellt habe, wird die Sortierung nach den äußeren Verknüpfungen angewendet und auf eine viel kleinere Menge angewendet.

AKTUALISIEREN

Unter der Annahme, dass das LIMIT auf eine große Menge (500.000?) angewendet wird, sieht es so aus, als könnten Sie die Spitze ausführen, bevor Sie einen der Joins ausführen.

SELECT * from (
    SELECT 
    `id`, ... `created_at`, ...
    ORDER BY `i`.`created_at` DESC 
    LIMIT 100 OFFSET 0) as i

    LEFT JOIN `mtrt_users` AS `u` ON i.user_id =u.id

    LEFT JOIN `twt_tweets_content` AS `t` ON t.id =i.id
    LEFT JOIN `twt_users` AS `tu` ON t.user_id = tu.id

    INNER JOIN `mtrt_items_searches` AS `r` ON i.id =r.item_id
    INNER JOIN `mtrt_searches` AS `s` ON s.id =r.search_id
    INNER JOIN `mtrt_searches_groups` AS `sg` ON sg.search_id =s.id
    INNER JOIN `mtrt_search_groups` AS `g` ON sg.group_id =g.id
    INNER JOIN `account_clients` AS `c` ON g.client_id =c.id                

GROUP BY i.id