假設我們有一個不同的大表。例如 - 3000行數據。 而且我們需要選擇所有的字段status < 4
。 我們知道相關性行將在2個月前(每行有日期列的詛咒)最大。將SQL SELECT語句的效率最大化
這個查詢是最有效的嗎?
SELECT * FROM database.tableName WHERE status<4
AND DATE< '".date()-5259486."' ;
(日期() - PHP,5259486 - 兩個月。)...
假設我們有一個不同的大表。例如 - 3000行數據。 而且我們需要選擇所有的字段status < 4
。 我們知道相關性行將在2個月前(每行有日期列的詛咒)最大。將SQL SELECT語句的效率最大化
這個查詢是最有效的嗎?
SELECT * FROM database.tableName WHERE status<4
AND DATE< '".date()-5259486."' ;
(日期() - PHP,5259486 - 兩個月。)...
假設你存儲日期爲DATETIME
,你可以試試這個:
SELECT * FROM database.tableName
WHERE status < 4
AND DATE < DATE_SUB(NOW(), INTERVAL 2 MONTHS)
此外,爲了優化搜索查詢,您可以使用EXPLAIN
(http://dev.mysql.com/doc/refman/5.6/en/explain.html),如下所示:
EXPLAIN [your SELECT statement]
您可以調整響應時間的另一點是仔細設置適當的索引。
索引用於快速查找具有特定列值的行。如果沒有索引,MySQL必須從第一行開始,然後讀取整個表以查找相關行。表格越大,成本越高。如果表中有相關列的索引,MySQL可以快速確定在數據文件中間尋找的位置,而無需查看所有數據。
這裏有一些解釋&教程在MySQL索引:
但是,請記住,使用TIMESTAMP而不是DATETIME更有效;前者是4個字節;後者是8.他們擁有相同的信息(除時區問題外)。
「你可以調整響應時間是通過仔細設置適當的索引。」 - 索引做了什麼以及如何放置它們? – user2216190
我已經更新了一些MySQL索引教程的答案。 –
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');
(當我寫這篇日期)
Thenk你爲你的答案。你能向我解釋你談論的「索引」方法嗎?以前從未使用過... – user2216190
@ user2216190。 。 。你可以從閱讀他們的文檔開始,http://dev.mysql.com/doc/refman/5.5/en/optimization-indexes.html。 –
如何存儲在您的日期? – George
有沒有辦法將舊記錄遷移到另一個表中?這是一個很好的實踐。另一個好的提示:爲這個select語句創建一個View。 –
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