0

我正在制作一个汽车零件系统,将所有零件存储在 mysql 中,然后搜索它们。

零件添加是这样的:您最多选择 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 之类的东西来存储最终未过滤的数组一次 24 小时,然后只过滤需要用 php 显示的部分?

这些是我考虑过的选项,但我知道必须有更好的方法来解决这个问题。

4

3 回答 3

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 操作。

另外,你为什么不在你的语句中使用一个WHERE子句SELECT来检索你想要的汽车呢?

编辑

如果您正在寻找零件,您肯定需要一个单独的零件表。然后你可以像这样进行 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 辆汽车,这也需要几毫秒。

于 2013-08-22T01:45:58.087 回答
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

?>
于 2013-08-22T02:24:26.890 回答
0

是的,看一辆车有很多部分有很多关系。

http://net.tutsplus.com/tutorials/databases/sql-for-beginners-part-3-database-relationships/

然后您可以使用内部连接来获取指定的部分。您可以执行 where 子句来匹配特定的 partId,以过滤掉不需要的零件或汽车。

于 2013-08-22T01:48:41.457 回答