sql >> Databáze >  >> RDS >> Mysql

Optimalizace dotazu MySql:Příliš pomalé při objednávání

Místo umístění Order By do hlavního dotazu, zabalte jej takto:

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

Podívejte se na plán dotazů. Zjistíte, že ve vašem případě se řazení provádí na vaší tabulce mtrt_items před provedením vnějšího spojení. V přepisu, který jsem částečně uvedl, se řazení použije po vnějších spojích a použije se na mnohem menší sadu.

AKTUALIZACE

Za předpokladu, že LIMIT je aplikován na velkou sadu (500 000?), vypadá to, že můžete provést vrchol před provedením jakéhokoli spojení.

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. Průvodce používáním Sphinx s PHP a MySQL

  2. GWFG v Oracle RAC

  3. Vkládejte data do 3 tabulek najednou pomocí Postgres

  4. Shoda celých slov s tečkami v MySQL