2016-02-19 112 views
0

我有幾個列的Postgres的表,一列,列最後更新日期時間。我的查詢是獲取開始和結束時間之間的所有更新行。這是我對此查詢的理解,在此查詢中使用WHERE而不是BETWEEN。基本查詢如下:SQL索引優化WHERE查詢

SELECT * FROM contact_tbl contact 
WHERE contact."UpdateTime" >= '20150610' and contact."UpdateTime" < '20150618' 

我是新創建SQL查詢,我相信這個查詢是做一個全表掃描。如果可能,我想優化它。我在UpdateTime列上放置了一個Normal索引,這需要很長時間才能創建,但使用此索引查詢速度更快。我不確定的一件事是,如果表格變得更大/列更改,必須重新計算此索引。另外,我正在考慮UpdateTime行上的CLUSTERED索引,但是我想問一下如果我有一個優化這個/如果我是在正確的軌道上的優化方法

回答

1

在UpdateTime上放置索引是正確的。它將允許使用索引而不是全表掃描。

2 WHERE使用BETWEEN關鍵字像上面與條件是完全相同的: http://dev.mysql.com/doc/refman/5.7/en/comparison-operators.html#operator_between

BETWEEN只是「語法糖」爲那些類似的語法更好。

指標允許更快的讀取速度,但減慢寫入(因爲像你提到,新的數據必須被插入索引爲好)。整個索引不需要重新計算。索引是智能數據結構,因此可以添加額外的數據,而無需額外的工作,但確實需要一些。

你可能會做更多的讀比寫,所以使用索引是一個好主意。

如果你正在做大量的寫入和讀取數,那麼你要考慮多一點了。這會降低業務需求。儘管總體吞吐量可能會減慢,但讀取延遲可能不是要求,但寫入延遲可能是,在這種情況下,您不需要索引。

例如,認爲這張彩票例子:每次有人買了票,你要錄製他們的姓名和准考證號。然而,唯一一次你必須閱讀這些數據,是在唯一的繪圖之後,看看誰有這個票號。在這個數據庫中,你不想索引票號,因爲他們會寫很多,讀數也很少。

+0

感謝您的詳細和快速回復。你怎麼看待在這裏使用CLUSTERED索引?是否有更多的工作/成本涉及新的數據插入使用一個與正常的一個? – user1077071