【发布时间】:2011-03-17 12:52:00
【问题描述】:
我正在编写一个带有产品过滤器的脚本。一切正常,但速度太慢。原因是查询太多。 Query5 选择大约 200 个条目。 Query12 在 130.000 个条目中“搜索”。
是否可以使用更少的查询来进行 mysql 连接或更快的连接?
<?php
$query5 = mysql_query("SELECT id,fabrikant,naam FROM producten_new WHERE icecat_cat='".secure_in($obj->icecat)."'".$selecteren."");
while($row5 = mysql_fetch_assoc($query5)){
foreach($_GET as $key=>$value){
if($key != "p" AND $key != "id" AND $key != "merk" AND $key != "submit" AND $value != "0"){
$query12 = mysql_query("SELECT COUNT(id) as aantal FROM producten_specs WHERE name='".secure_in(str_replace("_", " ", $key))."' AND value='".secure_in($value)."' AND product_id='".secure_in($row5['id'])."'");
$data12 = mysql_fetch_assoc($query12);
if($data12['aantal']){
$product_present = TRUE;
} else {
$product_present = FALSE;
break;
}
}
}
if($product_present){
echo $row5['id']."<br />";
$product_present = FALSE;
}
}
?>
谢谢。
编辑: 好的,重新开始。我希望这样更好(更快):
//Select products from category and brand
$query5 = mysql_query("SELECT id FROM producten_new WHERE icecat_cat='".secure_in($obj->icecat)."'".$selecteren."");
while($row5 = mysql_fetch_assoc($query5)){
$query5_ids .= $row5['id'].", ";
}
//Remove last ','
$query5_ids = substr($query5_ids, 0, -2);
//Get all $_GET's
foreach($_GET as $key=>$value){
if($key != "p" AND $key != "id" AND $key != "merk" AND $key != "submit" AND $value != "0"){
$specs_gets .= $key.",".$value.";";
$count_gets++;
$selection .= "name='".secure_in(str_replace("_", " ", $key))."' AND value='".secure_in($value)."' OR ";
}
}
//Remove last ';'
$specs_gets = substr($specs_gets, 0, -1);
//$selection = " AND ".substr($selection, 0, -4);
$selection = substr($selection, 0, -4);
//THE query..
//$query12 = mysql_query("SELECT product_id FROM producten_specs WHERE product_id IN ('".secure_in($query5_ids)."') ".$selection." ORDER BY product_id ASC");
$query12 = mysql_query("SELECT product_id FROM producten_specs WHERE ".$selection." ORDER BY product_id ASC");
while($row12 = mysql_fetch_assoc($query12)){
if($product_hold == $row12['product_id']){
$product_hold_count++;
} else {
$product_hold_count = FALSE;
$product_hold = $row12['product_id'];
$product_hold_count = 1;
}
if($product_hold_count == $count_gets){
$query12_ids_ok .= $row12['product_id'].", ";
$count_products++;
}
}
//Remove last ','
$query12_ids_ok = substr($query12_ids_ok, 0, -2);
EDIT2 网站链接:snip
EDIT3 更多信息:
网址示例:
index.php
?p=categorie
&id=5
&brand=Asus
&Display_inch=0
&Resolution=0
&Buldin_camera=0
&Chipset=0
&Processor-speed=2400+MHz
&Processorfamilie=0
&Hard+disk-interface=0
&Total+capacitie=500+GB
*snip (because its very long)*
&submit=Submit+Filter
数据库:
product_new(包含 3500 个条目)- 包含一般产品信息
id、供应商、价格、icecat_cat、名称等
1、华硕、500、笔记本、K72F
product_specs(包含 130.000 个条目)- Contians 产品规格
id、product_id、cat、name、value
1、1,处理器,处理器速度,2400 Mhz
2、1、硬盘、总容量、500 GB
EDIT4 我越来越近了,请参阅我第一次编辑中的代码,只有 product_id IN ('".secure_in($query5_ids)."') 必须添加到 query12 中。然后我得到了我想要的结果,而且速度更快!有人吗?
【问题讨论】:
-
producten_new 中的 200 行 10 GET 变量 = 2K 查询!你需要重组!!!
-
索引? for 循环多久执行一次?
-
这有点复杂,也许是分开的东西。它正在放慢速度,因为您在 while 语句中有和 foreach 。几行可以正常工作,但如果数据增加,时间也会增加。
-
有点难以理解你在做什么,因为你的桌子似乎是荷兰语(猜猜!)但你可以做的第一件事是使用
IN()一次获取一堆物品和ORDER BY FIELD当您发送第二个查询时(假设您在第二个查询中没有识别字段) -
@JohnP:它是荷兰语,是的,他应该考虑使用英语作为通用语(变量、表、类和函数名称、cmets,...)。