2010-02-01 46 views
3

我在MySQL中有幾個表,它們是按時間順序存儲的數據。我最後在這個表中添加了包含日期字段的覆蓋索引。在我的查詢中,我使用BETWEEN操作爲日期字段選擇了一段時間的數據。所以我的WHERE語句由覆蓋索引的所有字段組成。在MySql中BETWEEN操作的索引

當我執行extra列中的EXPLAIN查詢時,我有「使用where」 - 所以,正如我想的那樣,這意味着,該日期字段不會在索引中搜索。當我選擇一段時間的數據時 - 我使用「=」操作而不是BETWEEN和「使用哪裏」 - 沒有出現 - 全部在索引中搜索。

我可以做什麼,我的所有我的WHERE語句要在索引中搜索,包含BETWEEN操作?

UPDATE

表結構:

CREATE TABLE phones_stat (
    id_site int(10) unsigned NOT NULL, 
    group smallint(5) unsigned NOT NULL, 
    day date NOT NULL, 
    id_phone mediumint(8) unsigned NOT NULL, 
    sessions int(10) unsigned NOT NULL, 
    PRIMARY KEY (id_site,group,day,id_phone) USING BTREE 
) ; 

查詢:

SELECT id_phone, 
     SUM(sessions) AS cnt 
    FROM phones_stat 
WHERE id_site = 25 
    AND group = 1 
    AND day BETWEEN '2010-01-01' AND '2010-01-31' 
GROUP BY id_phone 
ORDER BY cnt DESC 
+0

您是否檢查過如果使用> =和<=是否會發生同樣的情況? 哪個版本的MySql? – 2010-02-01 07:08:04

+0

我試圖用one>操作來執行查詢,情況不會改變。 i ;,使用mysql 5.1服務器 – hippout 2010-02-01 07:18:52

+0

粘貼涉及的表的整個模式,查詢和解釋計劃。 BETWEEN應該能夠範圍掃描以涉及的字段開始的索引,除非優化器決定有更好的方式。 – MarkR 2010-02-01 07:41:59

回答

2

有多少行,你呢?有時如果優化器認爲不需要索引(例如,如果表中的行數非常少),則不使用索引。你能告訴我們你的SQL看起來像什麼嗎?

您可以嘗試暗示您的索引使用情況並查看EXPLAIN中的內容,以確認您的索引被忽略,例如,

http://dev.mysql.com/doc/refman/5.1/en/optimizer-issues.html

+0

我的索引被使用,但不是全部,它覆蓋了 - 所以它最終由3個帶有日期字段的字段組成。 – hippout 2010-02-01 07:33:38

0

如果你被id_phone分組,然後一個更有用的指標將是一個如果你更改索引到,並重新運行查詢這與即

... PRIMARY KEY (id_phone, id_site, `group`, day) USING BTREE 

開始,確實它有幫助嗎?