2013-08-19 45 views
0

假設我們有一個不同的大表。例如 - 3000行數據。 而且我們需要選擇所有的字段status < 4。 我們知道相關性行將在2個月前(每行有日期列的詛咒)最大。將SQL SELECT語句的效率最大化

這個查詢是最有效的嗎?

SELECT * FROM database.tableName WHERE status<4 

AND DATE< '".date()-5259486."' ; 

(日期() - PHP,5259486 - 兩個月。)...

+0

如何存儲在您的日期? – George

+0

有沒有辦法將舊記錄遷移到另一個表中?這是一個很好的實踐。另一個好的提示:爲這個select語句創建一個View。 –

+0

3000行不是一個非常大的表!爲了提高效率,只列出你需要的列,[不要使用SELECT *](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/10/bad-habits-to-kick-using-select -omitting-the-column-list.aspx),還可以考慮在Date和Status上創建一個索引。 – GarethD

回答

1

假設你存儲日期爲DATETIME,你可以試試這個:

SELECT * FROM database.tableName 
WHERE status < 4 
    AND DATE < DATE_SUB(NOW(), INTERVAL 2 MONTHS) 

此外,爲了優化搜索查詢,您可以使用EXPLAINhttp://dev.mysql.com/doc/refman/5.6/en/explain.html),如下所示:

EXPLAIN [your SELECT statement] 

您可以調整響應時間的另一點是仔細設置適當的索引。

索引用於快速查找具有特定列值的行。如果沒有索引,MySQL必須從第一行開始,然後讀取整個表以查找相關行。表格越大,成本越高。如果表中有相關​​列的索引,MySQL可以快速確定在數據文件中間尋找的位置,而無需查看所有數據。

這裏有一些解釋&教程在MySQL索引:

但是,請記住,使用TIMESTAMP而不是DATETIME更有效;前者是4個字節;後者是8.他們擁有相同的信息(除時區問題外)。

+0

「你可以調整響應時間是通過仔細設置適當的索引。」 - 索引做了什麼以及如何放置它們? – user2216190

+0

我已經更新了一些MySQL索引教程的答案。 –

0

3,000行數據對於數據庫來說並不大。實際上,它位於小方方。

查詢:

SELECT * 
FROM database.tableName 
WHERE status < 4 ; 

應在3000行運行很快,除非每行是非常非常大的(說10K)。您始終可以在status上放置索引以使其運行速度更快。

通過cassi.iup建議的查詢更有意義:

SELECT * 
FROM database.tableName 
WHERE status < 4 AND DATE < DATE_SUB(NOW(), INTERVAL 2 MONTHS); 

它將在status, date執行與綜合指數更好。我的問題是:你想要狀態爲4的所有行還是希望在過去兩個月中狀態爲4的所有行?在第一種情況下,您必須不斷更改查詢。你會用更好:

SELECT * 
FROM database.tableName 
WHERE status < 4 AND DATE < date('2013-06-19'); 

(當我寫這篇日期)

+0

Thenk你爲你的答案。你能向我解釋你談論的「索引」方法嗎?以前從未使用過... – user2216190

+0

@ user2216190。 。 。你可以從閱讀他們的文檔開始,http://dev.mysql.com/doc/refman/5.5/en/optimization-indexes.html。 –