2008-12-01 56 views
0

是否有可能在php腳本中執行簡單的count(*)查詢,而另一個php腳本正在執行insert ... select ... query?是否有可能做插入計數(*)...選擇... mysql/php中的查詢?

這種情況是,我需要創建一個表,其他表中有〜1M或更多的行,並且在插入時,我不希望用戶感覺頁面凍結,所以我試圖更新計數,但是在插入背景時通過使用表中的select count(*),直到插入完成後,我纔得到0。

那麼有什麼辦法可以先問MySQL返回部分結果?還是有一種快速的方法來執行一系列插入數據,從先前的選擇查詢中獲取數據,同時具有與insert ... select ... query相同的性能?

環境是php4.3和MySQL4.1。

回答

0

如果您正在執行單個INSERT ... SELECT,那麼不會,您將無法獲得中間結果。事實上,這將是一件不好的事情,因爲用戶永遠不應該看到處於中間狀態的數據庫只顯示語句或事務的部分結果。欲瞭解更多信息,請閱讀ACID合規性。

也就是說,MyISAM引擎可能會因此而快速鬆動。我非常肯定,我已經看到MyISAM提交了一些但不是來自INSERT ... SELECT的所有行,當我中止它的一部分時。不過,你還沒有說過你的表使用了哪個引擎。

0

其他用戶在提交之前無法看到插入。這通常是一件好事,因爲它確保他們看不到半數的數據。但是,如果您希望他們查看中間數據,則可以在插入時引發偶然性調用以「提交」。

順便說一句 - 不要讓任何人告訴你打開自動提交。這是一個巨大的時間浪費。我在我的數據庫上有一個「刪除並重新插入」的作業,當我關閉自動提交時,只需要1/3的時間。

3

不降低性能?不見得。有一點性能損失,也許...

但是,爲什麼你經常創建表並插入數百萬行?如果你很少這樣做,你不能只是警告管理員(大概是唯一允許做這種事的人),這需要很長時間。如果你一直在做,你真的確定你沒有這麼做嗎錯了

0

要明確一點,MySQL 4默認情況下未配置爲使用事務。如果我沒有記錯的話,它使用MyISAM表類型來鎖定每個插入的整個表。

最好的辦法是使用其中一個MySQL批量插入功能,例如LOAD DATA INFILE,因爲插入大量數據的速度會顯着加快。至於計數,您可以將插入物分成N組(1000或1000),然後將進度計分成N個部分,並根據每個組的請求進行更新。

編輯:要考慮的另一件事是,如果這是模板的靜態數據,那麼您可以使用「select into」來創建一個具有相同數據的新表。不知道你的應用程序是什麼,或者預期的功能,但是這也可以。

+0

LOAD DATA INFILE從OP獲取文件中的數據,而不是另一個表中的SELECT。在加載之前,必須將該SELECT的結果複製到臨時文件中。這與目前的解決方案相比可能沒有任何改進。 – 2008-12-01 18:05:40

2

我同意斯坦的意見,如果您在PHP請求期間一次拷貝100萬行,這是一個紅旗。

我相信在大多數人們試圖微觀優化SQL的情況下,他們可以通過以不同方式接近問題來獲得更高的性能和吞吐量。 SQL不應該是你的瓶頸。

0

如果您可以訪問控制檯,您可以詢問各種狀態問題,這些問題會提供您正在查找的信息。有一個類似「SHOW processlist」的命令。