sql >> Database >  >> RDS >> Mysql

Optimaliseer MySql-query:te traag bij het bestellen

In plaats van de Order By in de hoofdquery, wikkel het als volgt:

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

Bekijk het zoekplan. U zult zien dat in uw geval de sortering wordt uitgevoerd op uw tabel mtrt_items voordat de outer join wordt uitgevoerd. In de herschrijving die ik gedeeltelijk heb verstrekt, wordt de sortering toegepast na de outer joins en op een veel kleinere set.

UPDATE

Ervan uitgaande dat de LIMIT wordt toegepast op een grote set (500.000?), lijkt het erop dat u de top kunt uitvoeren voordat u een van de joins uitvoert.

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


  1. Voeg huidige datum/tijd in met now() in een veld met MySQL/PHP

  2. dagen genereren uit datumbereik

  3. SET-operators in SQL

  4. Hoe geef ik een []slice door aan een IN-voorwaarde in een voorbereide SQL-instructie met ook niet-IN-voorwaarden?