Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Zoptymalizuj zapytanie MySql:zbyt wolno podczas składania zamówienia

Zamiast umieszczać Order By do głównego zapytania, zawiń je w następujący sposób:

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

Spójrz na plan zapytań. Przekonasz się, że w twoim przypadku sortowanie odbywa się na twojej tabeli mtrt_items przed wykonaniem sprzężenia zewnętrznego. W przepisaniu, które częściowo przedstawiłem, sortowanie jest stosowane po złączeniach zewnętrznych i jest stosowane na znacznie mniejszym zestawie.

AKTUALIZUJ

Zakładając, że LIMIT jest stosowany do dużego zestawu (500 000?), wygląda na to, że możesz wykonać szczyt przed wykonaniem któregokolwiek z łączeń.

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL:odmowa dostępu użytkownika do bazy danych

  2. Jak rzutować znak na liczbę całkowitą podczas odpytywania w django ORM?

  3. Lista procedur/funkcji składowanych Wiersz poleceń Mysql

  4. Uzyskiwanie różnicy między liczbami dwóch podzapytań

  5. Ile pamięci rzeczywistej jest używane z deklaracją varchar(100) w mysql?