2015-01-09 66 views
0

比方說,我有一個收件箱系統與讀取/未讀消息。我希望消息在打開後切換爲未讀消息。更新所有地方與計數然後更新

每次打開消息, 檢查消息是否未讀取消息的主鍵上的WHERE子句時,使用WHERE子句指定unread = 1,然後如果計數優於0,UPDATE更好入口到所讀取的字段設置爲1,

,或者

每次做一個更新查詢與WHERE子句中指定的消息的主鍵和讀字段= 0

爲了清楚起見,是它更好地做到這一點

SELECT COUNT(*) FROM messages WHERE messages.id = 1 AND messages.read = 0 
if (query_above > 0) 
    UPDATE messages SET messages.read = 1 WHERE messages.id = 1 

UPDATE messages SET messages.read = 1 WHERE messages.id = 1 AND messages.read = 0 

我不願意找一個更好的辦法在這種情況下,要做到這一點;在任意情況下這是一個純粹的性能問題。

+1

2查找與1查找。應該很清楚。 – Sirko

+1

是否有你試圖超優化這個原因?你認爲'UPDATE消息SET messages.read = 1 WHERE messages.id = 1'會在你讀''已經是'1'時引發問題嗎?此外,是否有可能多個連接同時嘗試同一個操作,而不是同一條消息?這樣首先計算可能會導致您採用陳舊的信息? –

+0

不,沒有:)我多年來一直在使用第二種解決方案,我一直在想如果這是做這件事的最好方式,因爲我已經看到其他人以相反的方式做。 – whitep4nther

回答

2

單個查詢更好。無論哪種方式,數據庫引擎將不得不通過它的表,你可以節省把它報告給你的處理應用程序的開銷,然後再發送另一個查詢請求來改變數據庫引擎剛剛訪問過的行(現在已經有了以再次查找)

+0

嗯,事情是,一旦消息被讀取,你做一個無用的更新查詢時,與其他解決方案做只有一個COUNT查詢,其成本較少。我的想法是對的嗎? – whitep4nther

+0

讀取COUNT結果的開銷遠遠大於UPDATE查詢的總運行時間。它甚至可能是UPDATE查詢比COUNT更快;我不確定,但讀取結果,進行計算,然後再準備另一個查詢比簡單的更新明顯更多。 – Erik

0

單個查詢更好有幾個原因。但首先,此查詢:

UPDATE messages 
    SET messages.read = 1 
    WHERE messages.id = 1 AND messages.read = 0; 

可以通過messages(id, read)上的索引進行優化。如果id已經是表格上的唯一鍵或主鍵,則read不是必需的。

爲什麼一個查詢更好?首先,存在運行多個查詢的問題。每個都有自己的開銷,所以更少的查詢速度更快。 count(*)有一個更重要的問題用於測試存在。 SQL引擎並不知道你只關心「0」或「大於0」,所以它實際上必須計算一切。一種更好的方式來編寫查詢使用exists

if exists (select 1 from messages where messages.id = 1 and messages.read = 0) 
    UPDATE messages SET messages.read = 1 WHERE messages.id = 1 

此停在第一行匹配並停止處理count()繼續處理。

第三個原因是比賽條件。在多線程應用程序中,ifupdate之間的內容可能會發生變化。這是使用一個查詢的最強有力的理由。一個查詢不僅更快,而且更準確。