2012-12-13 84 views
0

的效率這是一個理論上的例子 - 我已經提出作爲幫助我學習的方式的問題。我很感謝任何指點和解釋,因爲當涉及到大型數據庫時,我不僅僅是業餘愛好者,而是熱衷於瞭解更多。提高SQL語句

以下SQL即將被800萬條記錄,可以做些什麼來提高效率的數據庫上運行?

SELECT 
    email_subscribers_extra.sendscont, 
    email_list_subscribers_new.subscriberid, 
    email_subscribers_extra.lastopen  
FROM 
    email_list_subscribers_new 
LEFT JOIN 
    email_subscribers_extra ON email_subscribers_extra.subscriberid = email_list_subscribers_new.subscriberid 
WHERE 
    email_list_subscribers_new.partner = 'AJ' 
ORDER BY 
    email_subscribers_extra.lastsend ASC LIMIT 0, 40000 

編輯: 讓我們假定它是一個Linux的Apache,MySQL服務器因爲這是我通常使用。目前沒有索引集。

+3

那麼,對於一個:'LIMIT'是** **沒有任何ANSI/ISO SQL標準的一部分......所以你已經是在什麼數據庫系統甚至支持這種非常具體.... –

+1

有什麼有問題的表上的索引? –

+1

EXPLAIN PLAN會告訴你比這裏任何人都更好。 – duffymo

回答

2

提高效率是SQL調諧加載短語。您通常會添加索引以加快SELECT性能,但添加索引通常會降低更新速度。每個INSERT和DELETE語句都需要重寫索引。許多UPDATE語句也需要重寫索引。

不看執行計劃,並在不考慮INSERT,UPDATE效果和DELETE語句,我建議在

  • 增加索引的WHERE子句中使用的每一列,
  • 每在JOIN條件使用柱,
  • 在ORDER BY使用每一列。

大多數dbms會自動將索引添加到外鍵引用中使用的列。不過,其中至少有一些會讓你稍後放棄這個索引。

所以添加索引,或者確保支持外鍵約束的索引存在,在這些列。

  • email_list_subscribers_new.subscriberid
  • email_list_subscribers_new.partner
  • email_subscribers_extra.subscriberid
  • email_subscribers_extra.lastsend

在某些情況下,一個多列索引會給你兩個多更好地選擇性能單列索引。