sql >> Database teknologi >  >> RDS >> Mysql

Rows_sent:12 Rows_examined:549024 - hvordan optimerer man mySQL-forespørgslen?

For det første er der et problem med din forespørgsel. Du bruger LEFT JOIN, men du bliver til en implicit INNER JOIN med din where-klausul:AND (a.list_in='store' OR u.shop_active='1')

Hvorfor gør dette LEFT JOIN til et implicit INDRE? Fordi LEFT JOIN vil producere NULL-værdier for u.shop_active, når der ikke er nogen matchende bruger, men NULL vil ALDRIG være lig med '1'. Dette gør forespørgslen til en INNER JOIN, fordi alle rækker, der produceres af OUTER JOIN, vil blive filtreret efter WHERE-betingelsen.

Dette filter er også årsagen til ydeevneproblemet. Du har en ELLER-betingelse mellem kolonner i to forskellige tabeller. Der er intet indeks, der kan opfylde en sådan betingelse.

Her er en anden måde, som kan fungere bedre. Denne version søger kun efter fortegnelser, hvor (a.list_in !='store' og u.shop_active ='1'), når der er mindre end 12 list_in='store'-fortegnelser.

For at bruge følgende skal du sørge for, at du har et indeks på (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. Inspicering af slutningen af ​​en lang variabel værdi i VBA

  2. Slut dig til mig med Special Guest Michal Bar fra MS Access Team!

  3. FEJL 1452 (23000):Kan ikke tilføje eller opdatere en underordnet række:en fremmednøgle-begrænsning mislykkes

  4. Sådan returneres dublerede nøgler fra et JSON-dokument i SQL Server