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

Rows_sent:12 Rows_examined:549024 - come ottimizzare la query MySQL?

Prima di tutto, c'è un problema con la tua query. Usi LEFT JOIN, ma ti trasformi in un INNER JOIN implicito con la tua clausola where:AND (a.list_in='store' OR u.shop_active='1')

Perché questo trasforma il LEFT JOIN in un INNER implicito? Perché LEFT JOIN produrrà valori NULL per u.shop_active quando non ci sono utenti corrispondenti, ma NULL NON sarà MAI uguale a '1'. Questo trasforma la query in un INNER JOIN perché tutte le righe prodotte da OUTER JOIN verranno filtrate dalla condizione WHERE.

Questo filtro è anche la causa del problema di prestazioni. Hai una condizione OR tra le colonne in due tabelle diverse. Non esiste un indice che possa soddisfare una tale condizione.

Ecco un altro modo che potrebbe funzionare meglio. Questa versione cercherà solo le inserzioni in cui (a.list_in !='store' e u.shop_active ='1') sono presenti meno di 12 list_in='store'.

Per utilizzare quanto segue, assicurati di avere un indice su (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;