Php 选择带有限制和联合的查询-性能问题

Php 选择带有限制和联合的查询-性能问题,php,mysql,Php,Mysql,我想从mysql数据库中选择某些数据。我正在使用一个php循环和一个带有限制和并集的sql语句 问题:我的查询速度太慢了。一个联合声明耗时2-4秒。由于循环,整个查询需要3分钟。 是否有机会优化我的查询 我试着把这三条语句分开并合并结果。但这并不是真的更快。所以我认为工会不是我的问题 PHP/SQL: 我的代码正在运行两个foreach循环。代码工作正常。但问题在于性能 $sql_country = "SELECT country FROM country_list"; foreach ($d

我想从mysql数据库中选择某些数据。我正在使用一个php循环和一个带有限制和并集的sql语句

问题:我的查询速度太慢了。一个联合声明耗时2-4秒。由于循环,整个查询需要3分钟。 是否有机会优化我的查询

我试着把这三条语句分开并合并结果。但这并不是真的更快。所以我认为工会不是我的问题

PHP/SQL:

我的代码正在运行两个foreach循环。代码工作正常。但问题在于性能

$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秒。谢谢。