2011-10-11 59 views
1

範圍我有(start_date, end_date, description)表 - 爲了找到一個給定的時間內發生的事件,我做有效利用兩列的SQLite

SELECT * 
FROM table 
WHERE start_date < $view_end AND end_date > $view_start 

這正常工作,許多數據庫產品會能夠在兩列上使用索引來高效地找到結果 - 但SQLite只支持一次使用一個範圍索引(我可以執行大量索引等於比較,但只有一個索引大於或小於)。因此,如果我想查看一個百萬表中的中間10個事件,我只能使用一個索引來消除其中的一半,並且必須對另外50萬個表執行全表掃描。

是否有任何很酷的技巧,我可以做一個有效的方式重寫這個查詢,鑑於SQLite的限制?

回答

0

這不會是一樣快,如果你可以用兩個指標,但會遠遠快於只用在第二列的表掃描:

SELECT * 
FROM table 
WHERE start_date BETWEEN $view_start AND $view_end AND end_date > $view_start 

它會降低你的表掃描下降到僅記錄在您要查找的數據範圍之間開始(而不是在結束日期之前開始的所有記錄)

+0

原始查詢包括在$ view_start之前開始的記錄,而您的查詢不包含。 – Jeff

+0

@Jeff,我很清楚我的查詢與海報不同,它是基於'$ view_start'小於'$ view_end'並且'start_date'小於'end_date'的假設。除非另有說明,否則我認爲這完全是一個合理的假設。現在,您可以選擇我的包含記錄,其中OP查詢不包括'start_date = $ view_end',但它只是爲了便於閱讀而完成,您可以輕鬆地將其設置爲'start_date> $ view_start AND start_date <$ view_end '而不是如果你願意,它會仍然使用正確的索引。 – Seph

+0

這是更快,但是,我需要在視圖開始和視圖結束之間有任何/任何/部分自己的事件:( – Shish