gpt4 book ai didi

php - SELECT DISTINCT 太慢,如何使用 PHP 数组代替?

转载 作者:行者123 更新时间:2023-11-29 12:04:21 26 4
gpt4 key购买 nike

我有一个大型数据库,即使使用索引,当我使用SELECT DISTINCT时,它的速度也会减慢很多。我想我应该将其更改为使用数组,但不知何故它不起作用。我做错了什么?

原代码为:

$product_countries = $this->query("SELECT DISTINCT country FROM db_products");

$listing_countries = array();
while ($listing_details = $this->fetch_array($product_countries)){
if (!empty($listing_details['country'])){
$listing_countries[] = $listing_details['country'];
}
}

现在,我尝试将其更改为:

// $product_countries = $this->query("SELECT DISTINCT country FROM db_products");
$product_countries = array("2084", "1993");

以及 while 部分:

while ($listing_details = $product_countries){

但这不起作用。我在这里做错了什么?我很确定它位于 while 行中的某个位置,而且事实上,之前它使用了 mySQL 资源,然后我将其更改为数组,但我无法弄清楚:(

最佳答案

给定:

  $product_countries = array("2084", "1993");

不需要 while 循环。只需将该数组的内容分配给另一个数组即可。像这样:

  $product_countries = array("2084", "1993");
$listing_details = $product_countries;

就这样吧。 (您已经知道 $product_countries 数组中的值已经定义,并且不会计算为 FALSE,因此不需要任何条件测试。

如您所示,使用 while 循环,它将如何退出?对我来说看起来像是一个经典的无限循环。

<小时/>

如果这不是你问的问题...

就 MySQL 查询而言,唯一适合查询的索引是以 country 为前导列的 BTREE 索引(不是 HASH 索引)。理想情况下(对于此查询)仅在该单列上:

 ... ON db_products(country)

该查询应等同于 GROUP BY 查询:

 SELECT country FROM db_products GROUP BY country

我建议您对查询运行 EXPLAIN 以验证它是否使用索引而不是执行“使用文件排序”操作。 (这假设 db_products 是一个表,而不是一些轻率的 View 定义。)

我不明白为什么需要对empty函数的返回进行条件测试。如果 fetch_array 返回一行,则将定义变量,因此测试实际上仅检查从数据库返回的值是否为 FALSE。如果我想排除计算结果为 FALSE 的 country 值,我倾向于在查询定义中包含适当的谓词。

关于php - SELECT DISTINCT 太慢,如何使用 PHP 数组代替?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31798145/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com