Php 选择带有限制和联合的查询-性能问题
我想从mysql数据库中选择某些数据。我正在使用一个php循环和一个带有限制和并集的sql语句 问题:我的查询速度太慢了。一个联合声明耗时2-4秒。由于循环,整个查询需要3分钟。 是否有机会优化我的查询 我试着把这三条语句分开并合并结果。但这并不是真的更快。所以我认为工会不是我的问题 PHP/SQL: 我的代码正在运行两个foreach循环。代码工作正常。但问题在于性能Php 选择带有限制和联合的查询-性能问题,php,mysql,Php,Mysql,我想从mysql数据库中选择某些数据。我正在使用一个php循环和一个带有限制和并集的sql语句 问题:我的查询速度太慢了。一个联合声明耗时2-4秒。由于循环,整个查询需要3分钟。 是否有机会优化我的查询 我试着把这三条语句分开并合并结果。但这并不是真的更快。所以我认为工会不是我的问题 PHP/SQL: 我的代码正在运行两个foreach循环。代码工作正常。但问题在于性能 $sql_country = "SELECT country FROM country_list"; foreach ($d
$sql_country = "SELECT country FROM country_list";
foreach ($db->query($sql_country) as $row_country) { //first loop (150 entries)
$sql_color = "SELECT color FROM color_list";
foreach ($db->query($sql_color) as $row_color) { //second loop (10 entries)
$sql_all = "(SELECT ID, price FROM company
WHERE country = '".$row_country['country']."'
AND color = '".$row_color['color']."'
AND price BETWEEN 2.5 AND 4.5
order by price DESC LIMIT 2)
UNION
(SELECT ID, price FROM company
WHERE country = '".$row_country['country']."'
AND color = '".$row_color['color']."'
AND price BETWEEN 5.5 AND 8.2
order by price DESC LIMIT 2)
UNION
(SELECT ID, price FROM company
WHERE country = '".$row_country['country']."'
AND color = '".$row_color['color']."'
AND price BETWEEN 8.5 AND 10.8
order by price DESC LIMIT 2)";
foreach ($db->query($sql_all) as $row_all) {
$shopID[] = $row_all['ID']; //I just need these IDs
}
}
}
您有什么想法或提示可以加快查询速度吗?有关国家、颜色、价格、ID的索引可以将单个查询的性能从几秒钟提高到几毫秒甚至更短。但是仍然存在执行1500个查询的问题。根据您的系统,执行一次查询可能会增加大约10毫秒的开销,在您的情况下,这将增加15秒。您需要找到一种方法来最小化查询的数量——最好是单个查询
对于较低的限制(如本例中的2),可以将多个具有不同偏移量的限制1子查询组合在一起。我会动态生成这样一个查询
$priceRanges=[
['2.5', '4.5'],
['5.5', '8.2'],
['8.5', '10.8'],
];
$limit=2;
$offset=范围0,$limit-1;
$queryParts=[];
foreach$priceRanges作为$range{
$rangeFrom=$range[0];
$rangeTo=$range[1];
foreach$offset作为$offset{
$queryParts[]=
选择
选择ID
来自cmp公司
其中cmp.country=cnt.country
和cmp.color=clr.color
和cmp.price介于{$rangeFrom}和{$rangeTo}之间
按cmp订购。价格说明
限制1
偏移量{$offset}
身份证
来自国家/地区列表cnt
交叉连接颜色列表clr
具有的ID不为空
;
}
}
$query=内爆'UNION ALL',$queryParts;
这将生成一个相当长的联合查询。你可以看到一个和
我不能保证会更快。但是值得一试。创建一个国家、颜色、价格、IDAlso之间的综合指数,即使使用键控字段,速度通常也非常慢。看起来你正在尝试这样做。如果您使用的是MySQL 8,那么您也可以使用windows函数,您必须添加这些信息。这可能比运行150*10个查询要快。我会将大约100个查询合并成15个块中的大型UNION ALL语句。对于大型团体来说,联盟仍然是最快的解决方案。行号需要进行完整的表/索引扫描。@PaulSpiegel:你的第一条评论对我帮助很大。我可以把时间从25分钟缩短到20秒。谢谢。