2009-12-04 55 views
1

我在Doctrine的DQL中有一個查詢需要能夠使用MySQL的「FORCE INDEX」功能來大量減少查詢時間。下面就是查詢基本上看起來像在普通的SQL:獲取學說使用MySQL「FORCE INDEX」

SELECT id FROM items FORCE INDEX (best_selling_idx) 
WHERE price = ... (etc) 
LIMIT 200; 

我想我不得不延長一些學說組件能夠與DQL做到這一點(或者是有辦法注入任意SQL進入Doctrin的之一查詢?)。有人有主意嗎?

謝謝!

+0

我只是碰到了同樣的問題在原則2,而不是寫一個[自定義功能DQL(HTTP:/ /www.doctrine-project.org/blog/doctrine2-custom-dql-udfs)或[重寫爲本地查詢](http://www.doctrine-project.org/blog/doctrine2-native-queries)..並且改變了迫使MySQL使用錯誤索引和andHaving()的andWhere()。只是想分享那個快速和骯髒的修復,應該其他人使用Doctrine 2遇到這個職位。 – 2012-01-25 21:18:01

回答

5

我在網上發現了很少有用的Doctrine_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'); 
3

如果您不喜歡本機SQL,則可以使用以下修補程序。 https://gist.github.com/arnaud-lb/2704404

這個補丁建議將只創建一個自定義的沃克,並將其設置如下

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