2010-07-31 32 views

回答

5

好像我放棄這個建議,每週三次在這裏的話,也許我應該放棄,讓它去:-)不,我不這麼認爲:

別牛逼在列計算(或order by條款)採用每行的功能,如果你希望你的數據庫具有良好的伸縮性。你應該爲你的具體情況(措施,不要猜測),但這樣做的計算性能檢查時閱讀數據庫通常會影響您的擴展能力(這不會不管你的通訊錄數據庫,但商店我的工作有巨大的數據量)。

數「如何讓我的DB走得更快?」問題遠遠超過「我如何使用更少空間?」的數量那些。犧牲磁盤空間以提高性能是一個很好的途徑。

做計算的正確時間是在數據發生變化時。這樣,這些變化的成本就會在所有讀取中攤銷。

我的建議是創建另一列如dtLastAction包含排序值,那麼如果不爲null使用插入/更新觸發器將其設置爲一樣dtModified,或dtPosted如果dtModified爲null。從技術上講,這違反了3NF,但如果你知道自己在做什麼,那麼沒關係,觸發器保證了數據的一致性。

然後指數在dtLastAction列,看看您的查詢的速度改善的一些額外的工作插入和更新過程中(較小)的成本。我說,因爲較小的廣大大多數數據庫表的讀取往往比書面(顯然,這個方法沒有用,如果你的特殊情況是非常罕見的例外之一)。

另外,對於這種特殊情況下,你可以創建條目時,這意味着dtModified永遠空集dtModifieddtPosted爲相同的值。您仍然可以通過這兩個日期時間值相同的事實來檢測從未被修改過的帖子。

+0

是的,我認爲'dtLastAction'是偉大的。也許檢查是否檢查'dtModified'是否與'dtPosted'是相同的。我不需要1個額外的領域。也許把'dtModified'重命名爲'dtLastAction'會讓它更直觀 – 2010-07-31 12:43:34

+0

總的來說我同意降低讀取的成本。但是,這種特殊情況非常簡單,我認爲它並不能證明緩存的所有複雜性。例如。如果行動被刪除,那麼你需要將最後的行動日期更新爲剩餘的最新行動,噩夢! – malhal 2016-10-08 12:23:51

13

您可以使用COALESCE

ORDER BY COALESCE(dtModified, dtPosted) 

另一種選擇是使用MySQL特定功能IFNULL,而不是COALESCE


測試在MySQL:

CREATE TABLE table1 (dtModified DATETIME NULL, dtPosted DATETIME NOT NULL); 
INSERT INTO table1 (dtModified, dtPosted) VALUES 
('2010-07-31 10:00:00', '2010-07-30 10:00:00'), 
(NULL     , '2010-07-31 09:00:00'), 
('2010-07-31 08:00:00', '2010-07-30 10:00:00'); 

SELECT dtModified, dtPosted 
FROM table1 
ORDER BY COALESCE(dtModified, dtPosted) 

結果:

dtModified   dtPosted 
2010-07-31 08:00:00 2010-07-30 10:00:00 
NULL     2010-07-31 09:00:00 
2010-07-31 10:00:00 2010-07-30 10:00:00 
+0

你可以在ORDER BY中使用COALESCE嗎? – 2010-07-31 11:26:58

+0

是的,我認爲你必須爲MySQL使用'IFNULL'。 – 2010-07-31 11:28:59

+0

@Daniel Vassallo:我只是在MySQL中測試它,它似乎工作正常。查看我使用的SQL的最新答案。 – 2010-07-31 11:31:08

0

在你的SELECT,使用CASE語句,採用最新的如果不爲null,否則發佈日期修改的值。然後爲你的ORDER BY使用新的「計算」列。

相關問題