2011-07-09 124 views
0

我有一個表格,其中包含以下字段:userid,logintime,birthdate
我需要獲取所有用戶之間的出生日期X和Y,先訂購最近登錄的用戶。mysql查詢結果訂單問題

SELECT * 
FROM table 
WHERE birtdate BETWEEN x AND Y 
ORDER BY logintime DESC 

如果我定義上只是birtdate索引,MySQL的會使用文件排序命令,我想避免的結果(表越來越大,查詢是受歡迎)。
定義索引(logintime,出生日期)沒有任何意義,我因爲logintime甚至不是在WHERE子句(我只將結果限制由生日設置)

在mysql中的任何優雅的解決方案?

回答

0

索引必須是birtdate,長時間(首先必須滿足WHERE子句,然後是訂單),但我不確定它可以使用索引進行條件之間的排序。需要排序多少條記錄?由於查詢流行,您可以使用memcache或其他緩存機制來提供結果而不會觸及數據庫

+0

目前該指數僅在生日,但文件排序開始沼澤數據庫下來。索引用於BETWEEN,所以這不是問題。我希望在mysql中有一個解決方案,不需要附加組件(memcache)等。 – Rado

+0

你會嘗試索引birtdate,logintime(如上所述,順序很重要,登錄時間索引,birtdate不能滿足查詢) –

1

birthdate,logintime上添加索引應該會改善您的查詢,但它有其不利之處。我相信logintime(顧名思義)頻繁更改,所以數據庫引擎必須更新基礎索引,這反過來會導致索引碎片化。
如果您的查詢具有足夠的選擇性並且使用了birthdate上的索引,那麼我不會看到filesort存在大問題。另外,您可以嘗試將查詢放入存儲過程的主體中;在這種情況下,與特定查詢相比,mysql將更有效地使用緩存。

0

AFAIK,具有在列的索引具有排序,無效果僅在搜索 - 它有助於其中子句,而不是爲了通過子句。

編輯:跟蹤@ Darhazer的鏈接 - 本質上是說「ORDER BY可以通過索引來滿意」

+0

索引可以幫助搜索,排序和分組結果。 – Rado

+1

@Bohemian閱讀[ORDER BY優化](http://dev.mysql.com/doc/refman/5.0/en/order-by-optimization.html) –

+0

@Darhazer感謝您的鏈接。我再次學習! – Bohemian