Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/299.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 “让条令使用MySQL”;力指数;_Php_Mysql_Doctrine - Fatal编程技术网

Php “让条令使用MySQL”;力指数;

Php “让条令使用MySQL”;力指数;,php,mysql,doctrine,Php,Mysql,Doctrine,我在Doctrine的DQL中有一个查询,它需要能够使用MySQL的“强制索引”功能,以大量减少查询时间。以下是普通SQL中查询的基本情况: SELECT id FROM items FORCE INDEX (best_selling_idx) WHERE price = ... (etc) LIMIT 200; 我假设我必须扩展一些条令组件才能用DQL实现这一点(或者有没有办法将任意SQL注入到Doctrin的一个查询中?)。有人有什么想法吗 谢谢 见。您应该能够使用RawSql来完成这一任

我在Doctrine的DQL中有一个查询,它需要能够使用MySQL的“强制索引”功能,以大量减少查询时间。以下是普通SQL中查询的基本情况:

SELECT id FROM items FORCE INDEX (best_selling_idx)
WHERE price = ... (etc)
LIMIT 200;
我假设我必须扩展一些条令组件才能用DQL实现这一点(或者有没有办法将任意SQL注入到Doctrin的一个查询中?)。有人有什么想法吗


谢谢

见。您应该能够使用RawSql来完成这一任务。

我在网上发现了很少有用的示例,下面是我创建查询的最终步骤

$q = new Doctrine_RawSql();
$q->select('{b.id}, {b.description}, {c.description}')
  ->from('table1 b FORCE INDEX(best_selling_idx) INNER JOIN table2 c ON b.c_id = c.id')
  ->addComponent('b', 'Table1 b')
  ->addComponent('c', 'b.Table2 c');

如果您不喜欢本机SQL,可以使用以下修补程序

此补丁建议只创建一个自定义助行器,并按如下所示进行设置

$query->setHint(Query::HINT_CUSTOM_OUTPUT_WALKER, 'UseIndexWalker');
$query->setHint(UseIndexWalker::HINT_USE_INDEX, 'some_index_name');

我创建了一个SqlWalker扩展,在MySql之上使用DQL应用使用索引和强制索引提示。可与createQuery和createQueryBuilder一起使用。可以为每个DQL表别名设置不同的索引提示

use Ggergo\SqlIndexHintBundle\SqlIndexWalker;
...
$query = ...;
$query->setHint(Query::HINT_CUSTOM_OUTPUT_WALKER, SqlIndexWalker::class);
$query->setHint(SqlIndexWalker::HINT_INDEX, [
    'your_dql_table_alias'           => 'FORCE INDEX FOR JOIN (your_composite_index) FORCE INDEX FOR ORDER BY (PRIMARY)',
    'your_another_dql_table_alias'   => 'FORCE INDEX (PRIMARY)',
    ...
]);

我刚刚在原则2中遇到了同样的问题。而不是写一个或。。。并将强制MySQL使用错误索引的andWhere()更改为andHaving()s。我只是想和大家分享一下,如果其他使用Doctrine 2的人看到这篇文章的话,这个快速而肮脏的修复方法。