2011-10-16 14 views
4

我有一個大約1400萬行的大表。每一行都包含一段文字。我還有另外一張大約有6000行的表格,每行有一個單詞,每個單詞有六個數值。我需要從第一個表格中取出每個文本塊並查找第二個表格中每個單詞出現的次數,然後計算每個文本塊的六個值的平均值並存儲它。PHP中的大型MySQL查詢

我有一個應該能夠處理它的i7和8gb內存的debian機器。目前我正在使用php substr_count()函數。然而,PHP並不認爲它是解決這個問題的正確方案。除了解決超時和內存限制問題之外,任何人都可以有更好的方式來做到這一點?是否有可能只使用SQL?如果不是什麼將是最好的方式來執行我的PHP,而不會超載服務器?

+0

所以你基本上重寫索引器像[solr](http://lucene.apache.org/solr/)? – CodeCaster

+1

我很確定這可以在純SQL中完成。你能提出確切的表格結構嗎? –

回答

3

從「大」表中一次一個地記錄每條記錄。將單個'塊'文本加載到程序中(php或以前),然後執行搜索和計算,然後在需要時隨時保存適當的值。

將每條記錄作爲自己的交易與其他交易分開。如果您中斷,請使用保存的值確定再次開始的位置。

完成現有記錄後,只需在將來輸入或更新記錄時執行此操作,這樣會更容易。您現在只需要大量的工作就可以獲得更新的數據。

+1

這就是我最終做到的。它有一千行然後再次呼籲自己做下一千,並吐出它花了多長時間。目前每20秒做1000次,所以大概需要三天。它只使用一個核心,但時間不是對象,所以我想我會放棄它。 – b3n

+0

@ b3n如果您願意,可隨時將此答案標記爲已接受。 –

0

重新設計()

如果上盤大小是不是!重要的只是關節表到一個


表6000放在內存中[內存表],並每隔一小時備份

INSERT IGNORE into back.table SELECT * FROM my.table;在大表EQ


創建「自己的」指數

添加列「人名索引」到大表行的ID

- 需要有關查詢更多信息以找到解決

+0

我已經添加了大表的索引,我正在考慮將其他表添加到內存中。目前我只是在大表中查找一個id,然後在另一個表中的每一行執行substr_count()。但我想運行大表中的每個ID的查詢,我認爲只是做一個SELECT *會導致超時或內存限制問題? – b3n

+0

爲什麼你做「前列值」使str_count和strlen並寫入數據庫 – user956584

1

你想要做什麼?如果您嘗試使用權重函數來創建類似搜索引擎的東西,那麼您可能應該放棄這一點,而是使用MySQL全文搜索功能和索引。如果你仍然需要這個特定的解決方案,你當然可以在SQL中完成。您可以在一個查詢中執行此操作,也可以在每次插入或更新行後運行一次觸發器。您無法通過PHP正確完成此操作,而無需跳過很多環節。

爲了給你一個具體的答案,我們確實需要更多關於查詢,數據結構和你正在做的事情的信息。

+0

對不起,如果我不正確解釋自己。我只想運行查詢一次,併爲1400萬段文本中的每一段生成6000個數據庫中匹配的所有單詞的六個平均值。 所以,我會有我的1400萬行,但我會在每行中添加6個列,並在文本正文中找到所有單詞的平均值。 – b3n