Mysql Symfony4-计数查询的条令分页性能低下(634484条记录)
我有一个需要分页的表(没有关系)。为此,我使用条令分页工具 该表包含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
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我编辑了这篇文章。