Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Rows_sent:12 Rows_examined:549024 - bagaimana cara mengoptimalkan kueri mySQL?

Pertama, ada masalah dengan kueri Anda. Anda menggunakan LEFT JOIN, tetapi Anda berubah menjadi INNER JOIN implisit dengan klausa where Anda:AND (a.list_in='store' OR u.shop_active='1')

Mengapa ini mengubah LEFT JOIN menjadi INNER implisit? Karena LEFT JOIN akan menghasilkan nilai NULL untuk u.shop_active ketika tidak ada pengguna yang cocok, tetapi NULL TIDAK PERNAH sama dengan '1'. Ini mengubah kueri menjadi INNER JOIN karena setiap baris yang dihasilkan oleh OUTER JOIN akan difilter oleh kondisi WHERE.

Filter ini juga menjadi penyebab masalah kinerja. Anda memiliki kondisi ATAU antara kolom dalam dua tabel yang berbeda. Tidak ada indeks yang dapat memenuhi kondisi seperti itu.

Berikut adalah cara lain yang mungkin berkinerja lebih baik. Versi ini hanya akan mencari cantuman di mana (a.list_in !='store' dan u.shop_active ='1') bila ada kurang dari 12 list_in='store' cantuman.

Untuk menggunakan yang berikut, pastikan Anda memiliki indeks di (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. DI MANA nilai TIDAK DI (subquery)

  2. Mengembalikan nilai fungsi yang disimpan di MyDAC

  3. MYSQL - Bandingkan SEKARANG () dan tanggal di Paris TimeZone dalam permintaan

  4. Menyimpan string JSON ke database MySQL

  5. Mysql Dayofyear di tahun kabisat