2014-11-25 3 views
1

쿼리가 작동합니다. 10.000 개의 procuts로 11 초가 걸립니다. ORDER BY를 사용하지 않으면 1 초 밖에 걸리지 않습니다. 하지만 주문이 필요합니다.SQL 최적화 - 쿼리는 11 초 걸립니다.

최적화 할 수 있습니까?

SELECT 
    u.urunID, 
    i.urunadi, 
    u.seo, 
    u.stok_kodu, 
    u.kstok_sayisi, 
    u.stok_sayisi, 
    u.goruntuleme, 
    (SELECT SUM(su.adet) FROM siparis_urunler su LEFT JOIN siparis s ON s.siparisID = su.siparisID WHERE s.durum_id NOT IN (26, 24) AND su.urunID = u.urunID) AS sadet 
FROM 
    urunler u 
INNER JOIN urun_isim i ON u.urunID = i.urunID 
WHERE 
    u.stok_sayisi <= u.kstok_sayisi 
AND u.durum = 1 
GROUP BY 
    u.urunID 
ORDER BY 
    sadet DESC 
LIMIT 0, 20 

는 EXPLAIN :

+----+--------------------+-------+--------+---------------------------------+-----------+---------+-----------------------------+------+----------------------------------------------+ 
| id | select_type  | table | type | possible_keys     | key  | key_len | ref       | rows | Extra          | 
+----+--------------------+-------+--------+---------------------------------+-----------+---------+-----------------------------+------+----------------------------------------------+ 
| 1 | PRIMARY   | i  | index | PRIMARY,urunadi2    | urunadi | 768  | NULL      | 4997 | Using index; Using temporary; Using filesort | 
| 1 | PRIMARY   | u  | eq_ref | PRIMARY,urunID,urunler,urunler2 | PRIMARY | 4  | katalog_db.i.urunID   | 1 | Using where         | 
| 3 | DEPENDENT SUBQUERY | sp | ALL | NULL       | NULL  | NULL | NULL      | 11 | Using where         | 
| 2 | DEPENDENT SUBQUERY | s  | ALL | PRIMARY,siparis     | NULL  | NULL | NULL      | 805 | Using where         | 
| 2 | DEPENDENT SUBQUERY | su | ref | surunler2      | surunler2 | 10  | katalog_db.s.siparisID,func | 1 | Using where         | 
+----+--------------------+-------+--------+---------------------------------+-----------+---------+-----------------------------+------+----------------------------------------------+ 
+0

'sadet'에 대한 색인이 있습니까? – Siyual

+0

이 쿼리 앞에 설명을 추가하고 results.Also 테이블 정의를 추가하여 질문을 편집하십시오. – Mihai

+0

내 첫 번째 대답이 삭제되었습니다. Q : siparis에서 왼쪽 조인을 사용하는 선택 합계()에는 내부 조인으로 강제 실행되는 WHERE 절이 있습니다. SIPARIS_URUNLER와 SIPARIS의 관계와 DURUM_ID 24 또는 26을 제외한 모든 것을 찾는 목적을 명확히 할 수 있습니까? – DRapp

답변

1

이 더 빨리 실행됩니까?

SELECT 
    u.urunID, 
    i.urunadi, 
    u.seo, 
    u.stok_kodu, 
    u.kstok_sayisi, 
    u.stok_sayisi, 
    u.goruntuleme, 
    SUM(su.adet) AS sadet 

FROM 
    urunler u 
    INNER JOIN urun_isim i  ON u.urunID = i.urunID 
    INNER JOIN siparis_urunler su ON su.urunID = u.urunID 
    LEFT JOIN siparis s   ON s.siparisID = su.siparisID 

WHERE 
    u.stok_sayisi <= u.kstok_sayisi 
    AND s.durum_id NOT IN (26, 24) 
    AND u.durum = 1 
GROUP BY 
    u.urunID, 
    i.urunadi, 
    u.seo, 
    u.stok_kodu, 
    u.kstok_sayisi, 
    u.stok_sayisi, 
    u.goruntuleme 
ORDER BY 8 DESC 
+0

헤이 @hashbrown 그것은 11 초를 잡고 있었다. 그리고 이제 0.027 초가 걸립니다. 고마워요! – yavuzkirez

+0

여기에 행복하다! 그것은 정말 좋은 개선입니다. – hashbrown

관련 문제