Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Rows_sent:12 Rows_examined:549024 - làm thế nào để tối ưu hóa truy vấn mySQL?

Trước hết, có một vấn đề với truy vấn của bạn. Bạn sử dụng LEFT JOIN, nhưng bạn biến thành INNER JOIN ngầm với mệnh đề where:AND (a.list_in ='store' OR u.shop_active ='1')

Tại sao điều này lại biến LEFT JOIN thành một INNER ngầm? Bởi vì LEFT JOIN sẽ tạo ra các giá trị NULL cho u.shop_active khi không có người dùng phù hợp, nhưng NULL sẽ KHÔNG BAO GIỜ bằng '1'. Điều này biến truy vấn thành một INNER JOIN vì bất kỳ hàng nào được tạo bởi OUTER JOIN sẽ được lọc theo điều kiện WHERE.

Bộ lọc này cũng là lý do cho sự cố hiệu suất. Bạn có một điều kiện HOẶC giữa các cột trong hai bảng khác nhau. Không có chỉ mục nào có thể thỏa mãn điều kiện như vậy.

Đây là một cách khác có thể hoạt động tốt hơn. Phiên bản này sẽ chỉ tìm kiếm các danh sách trong đó (a.list_in! ='Store' và u.shop_active ='1') khi có ít hơn 12 danh sách list_in ='store'.

Để sử dụng những thứ sau, hãy đảm bảo bạn có chỉ mục trên (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. Chọn bản ghi giữa hai ngày

  2. Bất kỳ lý do gì để không sử dụng các thủ tục được lưu trữ cho mọi truy vấn?

  3. Hợp nhất hai cột từ hai bảng thành một

  4. Dữ liệu MySQL sang JSON thông qua PHP

  5. Chồng chéo Truy vấn Đặt chỗ