2012-05-04 93 views
-1

我的嘗試是加入客戶和訂單表並加入lineitem和訂單表。我也索引了c_mktsegment字段。我最後的查詢是這樣的。我能做些什麼來改善它嗎?改善mysql查詢?

select 
    o_shippriority, 
    l_orderkey, 
    o_orderdate, 
    sum(l_extendedprice * (1 - l_discount)) as revenue 
from 
    cust As c 
    join ord As o on c.c_custkey = o.o_custkey 
    join line As l on o.o_orderkey = l.l_orderkey 
where 
    c_mktsegment = ':1' 
    and o_orderdate < date ':2' 
    and l_shipdate > date ':2' 
group by 
    l_orderkey, 
    o_orderdate, 
    o_shippriority 
order by 
    revenue desc, 
    o_orderdate; 
+0

它有什麼問題? – Cylindric

+0

這可能應該移到http://codereview.stackexchange.com/ – Sirko

回答

2

我沒有看到這個查詢有什麼明顯的錯誤。爲了獲得良好的性能,您可能應該在orders.o_custkey和lineitem.l_orderkey上使用索引。 c_mktsegment上的索引將使數據庫快速找到客戶記錄,但從那裏您需要能夠查找訂單和lineitem記錄。

你應該做一個解釋看看數據庫是如何處理查詢。這取決於很多因素,包括每個表中記錄的數量和密鑰的分佈,所以我不能通過查看查詢來說明計劃。但是如果您運行Explain並且看到它正在對錶進行全文讀取,則應該添加一個索引以防止出現這種情況。對於查詢優化而言,這非常符合規則#1。