2016-03-02 52 views
0

我有以下兩個SQLS對大數據集的持續運行:索引三列不同

SELECT * FROM table t WHERE (deleted = 1 OR blocked = 1) AND active = 1; 

SELECT * FROM table t WHERE active = 1 AND deleted = 0 AND blocked = 0; 

表目前只對ID的主鍵 - 我要補充什麼索引來提高性能這些查詢? (現在他們需要3分鐘大約一百萬條記錄)。

我一直在思考索引:

(deleted, active) 
(blocked, active) 
(active, deleted, blocked) 

我想這將解決這一問題,但是,這不是太多索引? mysql表有很多索引時如何表現行爲?

+0

'(active,deleted,blocked)'應該完成這項工作。 –

+0

不是真的,因爲它如何索引首先刪除,活躍的第二? –

+0

我認爲這實際上取決於你對'活躍','封鎖'和'刪除'記錄的數據分佈。活動/總比率如何?你有沒有嘗試添加一個'主動'索引? –

回答

0

簡答 - 更多索引增加了數據庫的大小。幾乎總是(除非你有一個算法問題),以提高速度 - 你使用更多的內存(空間)。

0

這取決於你的真正目標。

  • 查詢是否會干擾其他活動,並且您需要它們的侵入性較小?如果是這樣,我將使用id以1K行塊的形式走過桌子。 Chunking discussion
  • 您是否急於找到適合您的工作?我假設你在查詢發現有這些標誌的行時採取一些行動。如果是這樣,我會添加AND id > $where_left_off ORDER BY id LIMIT 1,工作在一個。 Pagination discussion

這裏有一個第三的方法:

INDEX(active, deleted, blocked, id) -- Active must be first; id must be last 

SELECT a.* 
    FROM table a 
    JOIN table b ON a.id = b.id 
    WHERE b.active = 1 
     AND b.deleted = b.blocked; 

這將有效地收集數據,以單通道兩個查詢。 (如果不方便,更改WHERE。)JOIN具有以下效果:使用b,只掃描部分新的INDEX(帶有active=1的部分),然後查找其餘數據(a)。

如果您正在「處理」找到的行,我建議您添加一個LIMIT,否則您的客戶可能會扼殺太多的列表中的罕見情況下有很多行的列表。