Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用Doctrine 2 DQL查询具有大量数据的左连接最有效的方法是什么_Php_Sql_Symfony_Doctrine Orm_Doctrine - Fatal编程技术网

Php 使用Doctrine 2 DQL查询具有大量数据的左连接最有效的方法是什么

Php 使用Doctrine 2 DQL查询具有大量数据的左连接最有效的方法是什么,php,sql,symfony,doctrine-orm,doctrine,Php,Sql,Symfony,Doctrine Orm,Doctrine,我有一个实体“硬币”和一个关于价格的公司联系在一起。价格每分钟更新一次,有数百万条条目 我试图实现的是一个DQL查询,它将获取到目前为止的最后一个价格 现在我看到了两种方法,我想知道哪一种在性能方面最好: 我可以在数据库中查找“prices.”“lastupdated”等于上次更新的价格 或者我可以抓取最后100个价格id,我们每分钟更新100个硬币,并在数据库中添加100个新行,限制为100,并在我的左侧连接上按“id”描述订购。 我知道在左连接上使用“限制”与“原则”是很棘手的,但我在这里找

我有一个实体“硬币”和一个关于价格的公司联系在一起。价格每分钟更新一次,有数百万条条目

我试图实现的是一个DQL查询,它将获取到目前为止的最后一个价格

现在我看到了两种方法,我想知道哪一种在性能方面最好:

我可以在数据库中查找“prices.”“lastupdated”等于上次更新的价格

或者我可以抓取最后100个价格id,我们每分钟更新100个硬币,并在数据库中添加100个新行,限制为100,并在我的左侧连接上按“id”描述订购。 我知道在左连接上使用“限制”与“原则”是很棘手的,但我在这里找到了一个解决方案: 在这里:

我想知道执行该查询需要最少的资源量

当然,我使用的是getArrayResults,使用的是partials和doctrine缓存

你对此有什么看法?
谢谢

我也遇到过类似的情况。例如,我运行一个网络,并希望从一个企业获取所有跟踪者ID,以更新他们已执行的操作。如果你想要喜欢的ID等,也是一样的

在这种情况下,您只对一列价格中的值感兴趣,但基于涉及不同字段coin_id,lastupdated的查询。为此,我强烈建议使用条令发送本机SQL查询。它的效率提高了几个数量级,避免了昂贵的费用等等

我在实体存储库中为您编写了一个示例查询

<?php

namespace App\EntityRepository;

use Doctrine\ORM\EntityRepository;
use PDO;

class CoinPricesRepository extends EntityRepository
{
    public function queryLatestPricesForCoinId(int $coin_id, int $limit)
    {
        $sql = 'SELECT price FROM coin_prices WHERE coin_id = :coin_id ORDER BY lastupdated DESC LIMIT  = :limit;';
        $params['coin_id'] = $coin_id;
        $params['limit'] = $limit;

        $stmt = $this->getEntityManager()->getConnection()->prepare($sql);
        $stmt->execute($params);

        return $stmt->fetchAll(PDO::FETCH_COLUMN);
    }
}

我一直在努力优化我的条令请求,并获得了一些令人敬畏的性能改进,如果有人正在寻找类似的解决方案,我将在这里与大家分享

首先,尽可能多地使用where子句限制左连接 第二,使用部分对象 第三,使用数组结果。这实际上改变了一切

/**
 * @return Coins[] Returns an array of Crypto objects
 */

public function findOneByTickerRelationnal($ticker)
{
    $em = $this->getEntityManager();
    $updatesrepository = $em->getRepository(Updates::class);
    $updates = $updatesrepository->findOneBy(['id'=> 1 ]);

    // This is where I’ve been doing additional work to limit my left join as much as possible with a ‘with’ on left join
    $recentMarkets = $updates->getMarket();
    $recentPrices = $updates->getPrice();
    $recentSources = $updates->getSources();

    $cryptos = $this->createQueryBuilder('c')
        ->select('partial c.{id, name, ticker}’) //<= use of partial is a plus but you need to know exactly which fields you want
        ->leftJoin('c.prices', 'p','WITH', 'p.last_updated >= :recentPrices')
        ->addSelect('partial p.{id, price_usd, daily_volume_usd, change_1h, change_1d, change_7d, rank}')
        ->leftJoin('c.markets', 'm','WITH', 'm.last_updated >= :recentMarkets')
        ->addSelect('partial m.{id, cur_supply, market_cap, max_supply}')
        ->leftJoin('c.sources', 's','WITH', 's.last_updated >= :recentSources')
        ->addSelect('s')
        ->where('c.ticker = :ticker')
        ->setParameter('recentPrices', $recentPrices)
        ->setParameter('recentMarkets', $recentMarkets)
        ->setParameter('recentSources', $recentSources)
        ->setParameter('ticker', $ticker)
        ->getQuery()
        ->getArrayResult(); //<=Changes everything 

    $results = $cryptos[0];

    return $results;
}

您是否与EXPLAIN一起检查了您的查询结果,该结果可能会给您一个关于性能的答案?很幸运,这对我不起作用,因为我的数据是如何构造的。我需要先获得实体币,然后再获得一些关于价格和其他实体的左联接。我更新了我的问题:我正在使用getArrayResults,正在使用partials和doctrine缓存。它已经取得了很好的效果,但并不理想。