我正在製作一個汽車零件系統,將所有零件存儲在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顯示的部分?
這些是我考慮的選項,但我知道必須有更好的方法來解決這個問題。
您選擇所有的表,並獲取所有數據,然後過濾結果,並比較他們,這是不對的, 你爲什麼不只是在搜索你的表格爲你的具體查詢!! ?? – MaveRick
你可以添加一個查詢的例子......'$ _GET ['selected']'這個變量的值是多少? – MaveRick
嗯,我認爲......在添加一輛新車後,將會有280個新的條目,如果選擇了280個零件......這是一個龐大的數字,所以我想我會讓php的壓力更大,但現在我意識到mysql可以在不選擇所有數據的情況下進行過濾,速度更快...因此,我很快就會重新制作這些數據... – TrueSkillZ