2015-04-29 105 views
0

我有一些帶有布爾列的表,積極列,以指示用戶是否處於活動狀態,然後查詢所有無效的用戶我用布爾型記錄的查詢效率

select * from users where active = 0 

我的大多數用戶是活躍的。我理解,如果沒有幫助,查詢需要檢查每條記錄,這在我的情況下效率低,速度相當慢。我有其他的表布爾列,說處理列,用來記錄是否訂單已被處理過,並查詢所有未處理訂單,

select * from orders where processed = 0 

我正在考慮把幫助表來記錄這些不活動的用戶和未處理訂單像,

CREATE TABLE IF NOT EXISTS failedRecord (tablename text, row integer) ; //row will be rowid 

我真的不喜歡這個自制的解決方案。我更喜歡使用解決方案數據庫提供的,但我不確定在布爾列上使用索引是否有用。 B/C我認爲索引是通過創建一個單獨的索引表來實現的,該索引表將從列創建的鍵映射到索引表中的行索引。對於布爾列作爲值只能是0或1我認爲映射將不會有效。

我使用sqlite,但我認爲其他數據庫也會有問題。


更新了我的問題。

我的大多數用戶都處於活動狀態,大部分訂單都被處理,即在我的情況下,這裏只有少數幾行是0,所以在第二個思考索引之後可能是有效的。是這樣嗎?

+0

如果你需要如此深入地訪問布爾值,那麼在啓動時如何加載所有布爾值,例如排序的ArrayList,所以你有一個內存緩存,並且只在需要的時候更新數據庫。 – cshu

+0

但我想問任何有效的方法來「加載所有這些」謝謝 – Qiulang

回答

0

如果大多數用戶都處於活動狀態,或者處理了大多數訂單,那麼只有很少的行匹配,並且您可以通過索引processed列來加速第二個查詢。 (如果您有SQLite 3.8.0或更新版本,則可以使用partial index避免對已處理的訂單編制索引。) 使用索引比手動創建幫助程序表要快得多並且更易於維護。

如果您使用的是反向條件(這樣大多數行將匹配),您將不得不訪問表的幾乎所有頁面。 在這個cae中,沒有比按順序閱讀所有頁面更快的機制。

+0

我的大多數用戶都是活躍的,大部分訂單都被處理,這就是爲什麼我說我正在考慮添加另一個表來記錄它們。 – Qiulang

+0

如果大多數匹配,檢查所有記錄是有效的 –

+0

但在我的情況下,他們大多數不匹配,是不是? – Qiulang

0

我發現這個問題被詢問並在sqlite郵件列表Index on BOOLEAN field回答。我希望他們是對的。如果所有可能的值是均等分佈的,並且您經常查找特定值,那麼即使您只有兩個可能的值,索引也會有所幫助,如果幾乎所有'2011'行,並且您「重新搜索‘2011’,那麼指數將幫助不大...

其實,盈虧平衡點大約是1/10:索引幫助,如果你是 選擇10%或更少的表中的記錄;否則,線性掃描速度更快,爲 。「

「這可以幫助當且僅當a)FLAG = 1的記錄多於FLAG = 0的記錄(反之亦然); b)大多數情況下,您正在查找屬於例如,如果有少量需要處理的「活動」或最近記錄,以及大量的「已處理」記錄存檔,「