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

Rows_sent:12 Rows_examined:549024 - jak optimalizovat dotaz mySQL?

Nejprve je problém s vaším dotazem. Používáte LEFT JOIN, ale změníte se v implicitní INNER JOIN s klauzulí where:AND (a.list_in='store' OR u.shop_active='1')

Proč se tím LEVÝ JOIN změní na implicitní INNER? Protože LEFT JOIN vytvoří hodnoty NULL pro u.shop_active, když neexistuje žádný odpovídající uživatel, ale NULL se NIKDY nebude rovnat '1'. Tím se dotaz změní na INNER JOIN, protože všechny řádky vytvořené OUTER JOIN budou filtrovány podle podmínky WHERE.

Tento filtr je také důvodem problému s výkonem. Mezi sloupci ve dvou různých tabulkách máte podmínku NEBO. Neexistuje žádný index, který by takovou podmínku mohl splnit.

Zde je další způsob, který může fungovat lépe. Tato verze bude vyhledávat pouze záznamy, kde (a.list_in !='store' a u.shop_active ='1'), pokud existuje méně než 12 záznamů list_in='store'.

Chcete-li použít následující, ujistěte se, že máte zapnutý index (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. Dotaz SQLite:získat všechny sloupce řádku (android)?

  2. Rozdělení dat pro rozsáhlé aplikace

  3. Jak používat Hibernate eqOrIsNull()

  4. Získání zprávy SQLEXCEPTION v procedurách MySQL