關於SQLite3的DBD :: SQLite我會將任何時間保存在僅選擇一次的INDEX上嗎?
如果我打算只查詢一次SELECT。
Should I CREATE a INDEX first and then query the SELECT
or
just query the SELECT without an INDEX,
which is faster ?
如果需要指定,col。在索引上是undef或1的INTEGER,就是這兩種可能性。
關於SQLite3的DBD :: SQLite我會將任何時間保存在僅選擇一次的INDEX上嗎?
如果我打算只查詢一次SELECT。
Should I CREATE a INDEX first and then query the SELECT
or
just query the SELECT without an INDEX,
which is faster ?
如果需要指定,col。在索引上是undef或1的INTEGER,就是這兩種可能性。
構建索引需要的時間比僅執行表掃描要花費的時間更長。因此,如果您的單個查詢 - 只運行一次 - 只是表掃描,則添加索引將會變慢。
但是,如果您的單個查詢不只是表掃描,則添加索引可能會更快。例如,如果沒有索引,數據庫可能會執行多次表掃描的連接,每個連接的行一次。那麼索引可能會更快。
我會說要對它進行基準測試,但對於一次性查詢而言,這聽起來很愚蠢,您只會運行一次。
如果你考慮設置和索引一個只有兩個可能值的列,那麼這是不值得的,因爲索引幾乎沒有什麼改進。索引對於具有高度唯一性並經常查詢特定值或範圍的列很有用。在其他硬指標使插入和更新慢,所以在這種情況下,你應該跳過它。
對於只有兩個值的列,索引可能值得。例如,也許你有一個包含大量行的表,並且布爾標誌「這是否需要處理?」。假設大多數事情不需要處理,那麼索引可能會大大加快「查找需要處理的東西」的查詢。一般來說,指數很好地發現了罕見的價值,無論該集合的整體基數如何。 (非常高的基數是一種特殊情況,其中* all *值很少) – derobert 2009-08-21 06:28:05
所以如果我想選擇一個列。多次(約100 k)兩種可能性,我應該建立一個指數? – Galaxy 2009-08-21 06:28:58
......罕見的定義爲小於1-10%,這取決於許多因素,例如隨機訪問表的花費與順序訪問的花費有多大。 – derobert 2009-08-21 06:29:57
由於沒有INDEX,SELECT將執行表掃描,使用新的INDEX將一次將數據庫索引保存爲較慢。 – Galaxy 2009-08-21 06:26:38
表掃描通常是O(n);索引通常是樹,因此構建索引可能不會比O(n)+ O(n * log(n))[n =行數]更快。 – derobert 2009-08-21 06:45:26