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

Rows_sent:12 Rows_examined:549024 - jak zoptymalizować zapytanie mySQL?

Po pierwsze, wystąpił problem z Twoim zapytaniem. Używasz LEFT JOIN, ale zamieniasz się w niejawne INNER JOIN z klauzulą ​​where:AND (a.list_in='store' OR u.shop_active='1')

Dlaczego to zmienia LEFT JOIN w niejawną INNER? Ponieważ LEFT JOIN wygeneruje wartości NULL dla u.shop_active, gdy nie ma pasującego użytkownika, ale NULL NULL NIGDY nie będzie równy „1”. Spowoduje to przekształcenie zapytania w INNER JOIN, ponieważ wszystkie wiersze utworzone przez OUTER JOIN zostaną przefiltrowane według warunku WHERE.

Ten filtr jest również przyczyną problemu z wydajnością. Masz warunek OR między kolumnami w dwóch różnych tabelach. Nie ma indeksu, który mógłby spełnić taki warunek.

Oto inny sposób, który może działać lepiej. Ta wersja będzie wyszukiwać tylko aukcje, w których (a.list_in !='store' i u.shop_active ='1') jest mniej niż 12 aukcji list_in='store'.

Aby skorzystać z poniższych, upewnij się, że masz indeks na (list_in, end_time)

SELECT * FROM
(
    SELECT a.listing_id, a.name, a.item_price, a.max, a.nb, a.currency,
           a.end_time, a.closed, a.bold, a.hl, a.buy_price, a.is_offer, a.reserve,
           a.owner_id, a.postage_amount, a.fb_current_bid, a.type, a.start_time,
           a.is_relisted_item, a.enable
     FROM db_listings a
    WHERE list_in = 'store'
     a.active=1 AND
     a.approved=1 AND 
     a.deleted=0 AND 
     a.creation_in_progress=0 AND
     a.closed=0
    ORDER BY end_time 
    LIMIT 12 
    )
    UNION ALL
    (
        SELECT a.listing_id, a.name, a.item_price, a.max, a.nb, a.currency,
           a.end_time, a.closed, a.bold, a.hl, a.buy_price, a.is_offer, a.reserve,
           a.owner_id, a.postage_amount, a.fb_current_bid, a.type, a.start_time,
           a.is_relisted_item, a.enable
        FROM db_listings a
        JOIN users u 
          ON a.owner_id = u.user_id
         AND u.shop_active = '1'
       WHERE list_in != 'store' AND
       a.active=1 AND
       a.approved=1 AND 
       a.deleted=0 AND 
       a.creation_in_progress=0 AND
       a.closed=0
       ORDER BY end_time 
       LIMIT 12 
    )
) sq
ORDER BY list_in, end_time
LIMIT 12;



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. dlaczego to zapytanie MySQL generuje nieprawidłowe numery wierszy?

  2. Transakcja MySQL z aplikacją księgową

  3. Jak stworzyć paginację za pomocą PDO PHP

  4. Wyeliminuj zduplikowane kolumny w zapytaniu z lewym złączem MySQL

  5. Przestarzałe funkcje MySQL