2011-04-25 110 views
1

我必須獲取在兩個日期之間具有publish_date的數據庫中的所有條目。所有日期都以整數形式存儲,因爲日期採用UNIX TIMESTAMP格式... 以下查詢完美無缺,但需要「太長時間」。它會返回10到20之前的所有條目。優化SQL查詢

SELECT * FROM tbl_post WHERE published < (UNIX_TIMESTAMP(NOW())-864000) 
AND published> (UNIX_TIMESTAMP(NOW())-1728000) 

有沒有什麼辦法可以優化這個查詢?如果我沒有弄錯,它會調用evey條目上的NOW()和UNIX_TIMESTAMP。我認爲將這兩個重複函數的結果保存到mysql @var中會使得比較速度更快,但它沒有。我運行的第二個代碼是:

SET @TenDaysAgo = UNIX_TIMESTAMP(NOW())-864000; 
SET @TwentyDaysAgo = UNIX_TIMESTAMP(NOW())-1728000; 
SELECT * FROM tbl_post WHERE fecha_publicado < @TenDaysAgo 
AND fecha_publicado > @TwentyDaysAgo; 

另一個令人困惑的事情是,PHP無法通過mysql_query()運行bove查詢; ?!

請,如果你對這個問題的任何意見會比歡迎:)

盧卡更多

+0

請注意,NOW()是一個常量表達式,它表示語句何時開始執行。所以MySQL沒有理由不能將'UNIX_TIMESTAMP(NOW()) - 864000'轉換成一個常量表達式。 (我不知道它是否......只是它很容易就可以。) – Matthew 2011-04-25 17:12:09

回答

2

PHP的的mysql_query函數(假設這是你所使用的)只能接受每串一個查詢,所以它不能執行第二個查詢中的三個查詢。

我建議將這些東西移動到stored procedure,然後從PHP調用它。

至於優化,設置這些變量是關於你的查詢優化。您需要對每一行進行比較,並且設置一個變量爲下限和上限提供了最快的訪問時間。

索引表中的一項改進,而不是查詢本身,可以將索引圍繞fecha_publicado進行聚類,以允許MySQL智能地處理該範圍值的查詢。通過將fecha_publicado設置爲表格的PRIMARY KEY,可以輕鬆完成此操作。

0

方式來優化將根據日期範圍的公佈鍵分區表tbl_post(每週似乎是適當的查詢)。這是一個可用於MySQL,PostgreSQL,Oracle,Greenplum等的功能。

這將允許查詢優化器將查詢限制爲更窄的數據集。

+0

分區是隻有在有數據的情況下才需要的功能。 MySQL也進行了分區。 – johannes 2011-04-25 17:08:12

+0

如果這樣的查詢時間太長,並且他已經在* published *字段上有一個索引,那麼很可能該表中有足夠的數據。我確實提供了一個鏈接到MySQL分區文檔:) – 2011-04-25 17:10:39

1

需要檢查的顯而易見的事情是,發佈日期是否有索引,並且正在使用?

3

請確保已發佈索引,並確保它正在使用中。

EXPLAIN SELECT * FROM tbl_post WHERE published < (UNIX_TIMESTAMP(NOW())-864000) AND published> (UNIX_TIMESTAMP(NOW())-1728000) 

應該是一個很好的開始,看看查詢中發生了什麼。要添加索引:

ALTER TABLE tbl_post ADD INDEX (published) 
+0

我設置我的fecha_publicado(或發佈)也是索引鍵,但性能還沒有真正提高?我用EXPLAIN進行了檢查,它說這個屬性是一個索引鍵。奇怪... – luigi7up 2011-04-26 14:47:49

+0

你可以發佈EXPLAIN輸出嗎? – johannes 2011-04-26 16:41:39

0

我同意BraedenP存儲過程在這裏適用。如果你不能使用或不想使用,你可以在PHP端生成日期,但是它們可能與數據庫不完全匹配,除非你讓它們同步。

您還可以更快地做到這一點,因爲可能會有3個單獨的查詢。查詢開始數據,查詢結束日期,然後將這些值用作目標查詢的輸入。