2014-11-25 64 views
1

该查询起作用。使用10.000个生产线时,需要11秒。如果我不使用ORDER BY,它只需要1秒。但我需要ORDER BY。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 

说明:

+----+--------------------+-------+--------+---------------------------------+-----------+---------+-----------------------------+------+----------------------------------------------+ 
| 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 2014-11-25 15:02:53

+0

在此查询前加上说明并用结果编辑您的问题。同时添加表格定义。 – Mihai 2014-11-25 15:04:35

+0

删除我的第一个答案。问:你选择sum()和left-join在siparis上有一个WHERE子句,强制它成为INNER JOIN。你能否澄清SIPARIS_URUNLER和SIPARIS的关系及其仅查找除DURUM_ID 24或26之外的所有用户的关系? – DRapp 2014-11-25 16:23:17

回答

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 2014-11-26 12:05:21

+0

很高兴在这里!这是一个非常好的改进。 – hashbrown 2014-11-26 12:58:52