cakephp中的强制索引3.3查询

时间:2017-11-20 14:15:51

标签: mysql cakephp indexing cakephp-3.0 query-builder

我使用CakePHP 3.3并尝试使用以下查询获取有关收入的一些统计信息

 $this->Bookings
    ->find('all')
    ->select(['total' => 'sum(total_price)'])
    ->join($joinTables) // It has product and few other tables
    ->where(["P.id = '" . $product_id . "'"])
    ->where(["Bookings.booking_status != 'CANCELLED'"])
    ->where(["Bookings.booking_date >= '" . $last6MonthDate->format('Y-m-d') . "'"]);

此查询使用索引(product_id,booking_status),但是,我希望此查询使用我在(product_id,booking_date)上创建的索引,这对于此查询会更快。我在上面的查询之前尝试使用以下行。

$this->Bookings->useIndex = 'FORCE INDEX(idx_product_id_booking_date)';

这并没有将FORCE INDEX子句添加到我的查询中,因此,MySQL会自动使用索引idx_product_id_booking_status

类似问题的答案是针对CakePHP的早期版本,它们不适用于CakePHP 3.3。请帮忙。

1 个答案:

答案 0 :(得分:0)

这个例子展示了如何在 selectjoin 语句中使用索引:


$this->loadModel('MainModel');
$query = $this 
    ->MainModel
    ->select(['MainModel.id' ])
    ->from('main_model MainModel USE INDEX (PRIMARY)')
    ->join([
         'table' => 'other_model OtherModel USE INDEX (PRIMARY)',
         'conditions' => 'OtherModel.id = MainModel.other_model_id'
    ]);


这将产生:

SELECT MyModel.id
FROM my_model MyModel USE INDEX (PRIMARY)
INNER JOIN my_other_model MyOtherModel USE INDEX (PRIMARY)
ON MyModel.id = MyModel.my_model_other_id