2013-08-22 46 views
0

我正在製作一個汽車零件系統,將所有零件存儲在mysql內部,然後搜索它們。用mysql和php處理大量數據搜索

部件添加如下所示: 您最多選擇280個零件並添加所有汽車信息,然後將所有零件序列化並放入mysql以及單行中的所有汽車信息。

(在這個例子中,我會說,我現在的數據庫中有1000輛汽車,所有這些車都有280份選擇)

的問題是,當我有1000輛汽車與他們每個人的有280件, php和mysql開始變慢,並花費大量的時間來加載數據,因爲零件的數量是1000 * 280 = 280 000.

我在所有的汽車上使用foreach,然後把每個部分放入另一個數組。 最終數組有280 000個項目,然後我通過搜索中的選定部分對其進行過濾,因此在28 000個零件中,它可能只需要打印12 500個零件(如果某人正在搜索相同的50個不同零件時間和250輛車有那部分)。

示例數據庫:http://pastebin.com/aXrpgeBP

$q=mysql_query("SELECT `id`,`brand`,`model`,`specification`,`year`,`fueltype`,`capacity`,`parts`,`parts_num` FROM `warehouse`"); 
    while($r=mysql_fetch_assoc($q)){ 
     $partai=unserialize($r['parts']); 
     unset($r['parts']); //unsetting unserialized parts so the whole car parts won't be passed into the final parts-only array 
     foreach($partai as $part){ 
     $r['part']=$parttree[$part]; //$parttree is an array with all the part names and $part is the part id - so this returns the part name by it's id. 
     $r['part_id']=$part; // saves the part id for later filtering selected by the search 
     $final[]=$r; 
     } 
    } 

      $selectedparts=explode('|', substr($_GET['selected'], 0,strlen($_GET['selected'])-1)); //exploding selected part ids from data sent by jquery into an array 

    foreach($final as $f){ 
     if(in_array($f['part_id'], $selectedparts)){ 
      $show[]=$f; //filtering only the parts that need to be shown 
     } 
    } 

    echo json_encode($show); 

這是我用所有的汽車零件到陣列的代碼和把它作爲JSON的瀏覽器。

我現在不在分頁,但稍後我會添加它以顯示只有10個部分。

可能的解決方案是將所有部件索引到一個不同的表格24小時(因爲新的部分將每天添加),然後只是強調MySQL超過PHP?因爲php現在正在做所有的努力工作。

或者使用類似memcached的東西存儲最後一個未過濾的數組一次24h,然後只是過濾需要用PHP顯示的部分?

這些是我考慮的選項,但我知道必須有更好的方法來解決這個問題。

+0

您選擇所有的表,並獲取所有數據,然後過濾結果,並比較他們,這是不對的, 你爲什麼不只是在搜索你的表格爲你的具體查詢!! ?? – MaveRick

+0

你可以添加一個查詢的例子......'$ _GET ['selected']'這個變量的值是多少? – MaveRick

+0

嗯,我認爲......在添加一輛新車後,將會有280個新的條目,如果選擇了280個零件......這是一個龐大的數字,所以我想我會讓php的壓力更大,但現在我意識到mysql可以在不選擇所有數據的情況下進行過濾,速度更快...因此,我很快就會重新制作這些數據... – TrueSkillZ

回答

0

您的查詢應該是這樣的:

<?php 

$selectedparts=explode('|', substr($_GET['selected'], 0,strlen($_GET['selected'])-1)); //exploding selected part ids from data sent by jquery into an array 
$where = ' id < 0 '; 
foreach ($selectedparts AS $a){ 
$where .= " OR `parts` like '%".$a."%'"; 
} 
$query = "SELECT * FROM `warehouse` WHERE ".$where." ORDER BY `id` ASC";//this is your query 
//.... rest of your code 

?> 
1

是的,你應該更強調MySQL。不要將每輛汽車的零件序列化爲單列中的一行。這非常低效。

取而代之,請自己製作一張parts表格,其中包含描述每個部件的各種數據項的列。

part_id  an autoincrement item. 
    car_id  which car is this a part of 
    partnumber the part's external part number (barcode number?) 
    etc 

然後,使用JOIN操作。

此外,您爲什麼不在您的SELECT聲明中使用WHERE子句來檢索您想要的汽車?

編輯

如果你正在尋找一個部分,你肯定希望有一個獨立的部分表。然後你可以做一個像這樣的SQL搜索。

SELECT w.id, w.model, w.specification, w.year, w.fueltype, 
     p.partnumber 
    FROM warehouse w 
    JOIN parts p ON (w.id = p.car_id) 
    WHERE p.partnumber = 'whatever-part-number-you-want' 

即使您的系統中有100K輛汽車,如果您將其索引爲正確,這將需要幾毫秒。

+0

我不是在尋找一輛特定的汽車,我正在尋找一個零件,在找到那個零件後,我就會知道它在哪個汽車中。 – TrueSkillZ

+0

請參閱我的編輯。 –

+0

非常感謝您的幫助! – TrueSkillZ