3

有没有办法暗示在 Doctrine2 中使用索引?MySQL USE INDEX 语法的等价物:

SELECT * FROM user u USE INDEX(my_super_index) ...
4

2 回答 2

5

我使用自定义树步行器找到了一个带有工作代码的要点:https ://gist.github.com/arnaud-lb/2704404

感谢作者!

但是,它不适用于使用与 MySQL 不同的语法的 RDBMS。

更新:前面的代码不适用于 FROM 子句中具有多个表的查询。所以这是我之前的walker的更新版本:

<?php

namespace __YOUR_NAMESPACE_;

use Doctrine\ORM\Query\SqlWalker;

class UseIndexWalker extends SqlWalker
{
    const HINT_USE_INDEX = 'UseIndexWalker.UseIndex';

    public function walkFromClause($fromClause)
    {
        $sql = parent::walkFromClause($fromClause);
        $index = $this->getQuery()->getHint(self::HINT_USE_INDEX);

        return preg_replace('/( INNER JOIN| LEFT JOIN|$)/', sprintf(' USE INDEX(%s)\1', $index), $sql, 1);
    }
}
于 2013-05-24T06:59:16.410 回答
0

请注意,当您在 Symfony 存储库中的 Query 上实现此功能时,您必须为 Hint Query::HINT_CUSTOM_OUTPUT_WALKER 的值设置 FDQN

<?php

namespace __YOUR_NAMESPACE_\Repository;

use Doctrine\ORM\Query;
use __YOUR_NAMESPACE_\UseIndexWalker;

class MyEntityRepository extends EntityRepository
{
    public function myFunction()
    {
        $query = $this->entityManager->createQueryBuilder()->select('my_field')->from('my_entity', 'my_entity')->getQuery();
        $query->setHint(Query::HINT_CUSTOM_OUTPUT_WALKER, UseIndexWalker::class);
        $query->setHint(UseIndexWalker::HINT_USE_INDEX, 'my_super_index');
    }
}
于 2019-07-29T16:00:58.480 回答