Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.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
Mysql Symfony4-计数查询的条令分页性能低下(634484条记录)_Mysql_Sql_Symfony_Doctrine_Symfony4 - Fatal编程技术网

Mysql Symfony4-计数查询的条令分页性能低下(634484条记录)

Mysql Symfony4-计数查询的条令分页性能低下(634484条记录),mysql,sql,symfony,doctrine,symfony4,Mysql,Sql,Symfony,Doctrine,Symfony4,我有一个需要分页的表(没有关系)。为此,我使用条令分页工具 该表包含634484条记录。条令执行以下查询: SELECT p0_.id AS id_0, p0_.name AS name_1, p0_.level AS level_2, p0_.alignment AS alignment_3, p0_.account_id AS account_id_4 FROM player.player p0_ ORDER BY p0_.level DESC LIMIT 25; 说明: id sele

我有一个需要分页的表(没有关系)。为此,我使用条令分页工具

该表包含634484条记录。条令执行以下查询:

SELECT p0_.id AS id_0, p0_.name AS name_1, p0_.level AS level_2, p0_.alignment AS alignment_3, p0_.account_id AS account_id_4 FROM player.player p0_ ORDER BY p0_.level DESC LIMIT 25;
说明:

id  select_type table   partitions  type    possible_keys   key key_len ref rows    filtered    Extra
1   SIMPLE  p0_     index       search  1       25  100.00
id  select_type table   partitions  type    possible_keys   key key_len ref rows    filtered    Extra
1   PRIMARY <derived2>      ALL                 634484  100.00  
2   DERIVED p0_     ALL PRIMARY             634484  100.00  Using temporary
执行时间: 1.04毫秒

有问题的查询

SELECT 
  COUNT(*) AS dctrn_count 
FROM 
  (
    SELECT 
      DISTINCT id_0 
    FROM 
      (
        SELECT 
          p0_.id AS id_0, 
          p0_.name AS name_1, 
          p0_.level AS level_2, 
          p0_.alignment AS alignment_3 
        FROM 
          player.player p0_ 
        ORDER BY 
          p0_.level DESC
      ) dctrn_result
  ) dctrn_table
说明:

id  select_type table   partitions  type    possible_keys   key key_len ref rows    filtered    Extra
1   SIMPLE  p0_     index       search  1       25  100.00
id  select_type table   partitions  type    possible_keys   key key_len ref rows    filtered    Extra
1   PRIMARY <derived2>      ALL                 634484  100.00  
2   DERIVED p0_     ALL PRIMARY             634484  100.00  Using temporary
分页方法:

<?php

namespace App\Core\Repository;

use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository as BaseServiceEntityRepository;
use Doctrine\ORM\Query;
use Doctrine\ORM\QueryBuilder;
use Doctrine\ORM\Tools\Pagination\Paginator;

abstract class ServiceEntityRepository extends BaseServiceEntityRepository
{
    protected function paginate(QueryBuilder $queryBuilder, int $currentPage, int $perPage)
    {
        $currentPage = $currentPage < 1 ? 1 : $currentPage;
        $firstResult = ($currentPage - 1) * $perPage;

        /** @var Query $query */
        $query = $queryBuilder
            ->setFirstResult($firstResult)
            ->setMaxResults($perPage)
            ->getQuery();

        $paginator = new Paginator($query, false);
        $numResults = $paginator->count();
        $hasPreviousPage = $currentPage > 1;
        $hasNextPage = ($currentPage * $perPage) < $numResults;

        return [
            'result' => $paginator->getIterator(),
            'currentPage' => $currentPage,
            'hasPreviousPage' => $hasPreviousPage,
            'hasNextPage' => $hasNextPage,
            'previousPage' => $hasPreviousPage ? $currentPage - 1 : null,
            'nextPage' => $hasNextPage ? $currentPage + 1 : null,
            'numPages' => (int)ceil($numResults / $perPage),
            'haveToPaginate' => $numResults > $perPage,
        ];
    }
}

您可以通过执行以下操作从计数查询中禁用DISTINCT关键字:

use Doctrine\ORM\Tools\Pagination\CountWalker;

$query->setHint(CountWalker::HINT_DISTINCT, false);

查看代码后,似乎这将阻止将distinct语句添加到count查询。

在中显示代码Repository@KarolGasienica我编辑了这篇文章。