2013-04-24 44 views
0

我想查看自上次檢查以來是否有更新的行。 我想知道是否有到檢查MySQL中更新行的最佳方法

"SELECT id FROM xxx WHERE changed > some_timestamp;" 

但是沒有更好的方法,因爲有200,000排它可以得到重非常快......將計是更好嗎?

"SELECT count(*) FROM xxx WHERE changed > some_timestamp;" 

我已經想創建一個單元測試,但我不是在這個最好的尚未/:

感謝您的幫助!


編輯:因爲在很多情況下都不會有,改變任何行,會是更好地始終與MAX(XX)第一次測試,如果該值大於舊的更新時間戳給予,然後執行一個問題?

回答

1

如果你只是想知道,如果任何行已經改變,下面的查詢可能快於不論是您的:

SELECT id FROM xxx WHERE changed > some_timestamp LIMIT 1 

只是爲了完整起見:確保你有一個指數changed

編輯:一個微小的性能改進

現在我想想,你或許應該做一個SELECT change代替selecing的id,因爲這消除了所有訪問表。如果執行任何更改,此查詢將很快告訴你。

SELECT changed FROM xxx WHERE changed > some_timestamp LIMIT 1 

它應該是一點點的速度比我的第一個查詢 - 不是很多,不過,因爲訪問單個錶行將會是非常快的。

我應該選擇MAX(changed)嗎?

選擇MAX(changed),正如Federico所建議的,應該會產生相同的索引訪問模式。找到索引中的最高元素是非常便宜的操作。發現任何大於某個常量的元素都可能更便宜,因此兩者應該具有大致相同的性能。在任何一種情況下,即使在非常大的表上,兩種查詢都非常快,只要 - 如果 - 有索引。

我應該先檢查是否有任何行被改變,然後檢索行中單獨的步驟

號如果沒有行已更改,SELECT id FROM xxx WHERE changed > some_timestamp任何這樣的檢查使其無法單獨執行。有結果時,它只會變成較慢的操作。除非添加昂貴的操作(如ORDER BY),否則性能應該(幾乎)與檢索的行數成線性關係。

+0

嘿,謝謝你的回答,你能檢查我的編輯,看看這是否仍然有效? – glesage 2013-04-25 22:47:32

1

就some_timestamp索引並運行:

SELECT MAX(some_timestamp) FROM xxx; 

如果表是MyISAM數據,查詢將立竿見影。

+0

嘿,謝謝你的回答,你能檢查我的編輯,看看這是否仍然有效? – glesage 2013-04-25 22:46:54

+0

嗨!如果您使用MyISAM,查找索引的最大/最小值始終是最便宜的操作。在InnoDB的情況下......我確定沒有明顯的差異,但MAX的等價物不是你寫的,它是:SELECT val FROM tab ORDER BY val DESC LIMIT 1 – 2013-04-27 13:16:15