Mysql
 sql >> база данни >  >> RDS >> Mysql

Rows_sent:12 Rows_examined:549024 - как да оптимизираме mySQL заявката?

Първо, има проблем с вашата заявка. Използвате LEFT JOIN, но се превръщате в имплицитно INNER JOIN с вашата клауза where:AND (a.list_in='store' ИЛИ ​​u.shop_active='1')

Защо това превръща LEFT JOIN в имплицитно INNER? Тъй като LEFT JOIN ще произведе NULL стойности за u.shop_active, когато няма съответстващ потребител, но NULL НИКОГА няма да е равно на '1'. Това превръща заявката във INNER JOIN, тъй като всички редове, произведени от OUTER JOIN, ще бъдат филтрирани от условието WHERE.

Този филтър е и причината за проблема с производителността. Имате условие ИЛИ между колоните в две различни таблици. Няма индекс, който да удовлетвори такова условие.

Ето още един начин, който може да работи по-добре. Тази версия ще търси само обяви, където (a.list_in !='store' и u.shop_active ='1'), когато има по-малко от 12 обяви list_in='store'.

За да използвате следното, уверете се, че имате включен индекс (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. Най-добрият начин за денормализиране на данни в Django?

  2. MySQL:Можете ли да посочите произволно ограничение?

  3. Разделяне на низове с помощта на mysql

  4. Ограничението CHECK в MySQL не работи

  5. Mysql Workbench не може да избере чужд ключ