2016-08-29 3 views
1

Я создаю сетку в yii2, и у меня есть 2400 данных, которые не так много, но время загрузки сетки так много. Я заполняю данные из представления базы данных mysql. Пожалуйста, объясните мне, как ускорить просмотр сетки?Yii2 Ускоренная оптимизация скорости передачи данных

Вот мой код:

public function search($params) { 
     $this->load($params); 

    $query = (new Query) 
      ->select('*') 
      ->from('view_quotation_grid') 
      ->orderBy('referenceno DESC'); 

    if ($this->referenceno != "") { 
     //$query->andFilterWhere(['like', '', $this->referenceno]); 
     $query->andFilterWhere(['LIKE', 'referenceno', $this->referenceno]); 
    } 

    $query->andFilterWhere(['LIKE', 'customer_name', $this->customer_name]); 
    $query->andFilterWhere(['LIKE', 'product_model', $this->product_model]); 
    $query->andFilterWhere(['LIKE', 'quotation_status', $this->quotation_status]); 
    $query->andFilterWhere(['LIKE', 'is_confirm', $this->is_confirm]); 
    $query->andFilterWhere(['LIKE', 'net_total', $this->net_total]); 
    $query->andFilterWhere(['LIKE', 'doc_date', $this->doc_date]); 

    $pages = clone $query; 
    $pages->select('COUNT(*) count'); 
    $pages = $pages->createCommand()->queryAll(); 
    $pages = $pages[0]; 

    $command = $query->createCommand(); 
    $sql = $command->sql; 
    $params = $command->params; 

    $dataProvider = new SqlDataProvider([ 
     'sql' => "$sql", 
     'params' => $params, 
     'totalCount' => $pages['count'], 
     'sort' => [ 
      'attributes' => [ 
       'sr', 
       'referenceno' => [ 
        'asc' => ['referenceno' => SORT_ASC], 
        'desc' => ['referenceno' => SORT_DESC], 
        'default' => SORT_DESC, 
        'label' => 'referenceno', 
       ], 
       'customer_name' => [ 
        'asc' => ['customer_name' => SORT_ASC], 
        'desc' => ['customer_name' => SORT_DESC], 
        'label' => 'customer_name', 
       ], 
       'quotation_status' => [ 
        'asc' => ['quotation_status' => SORT_ASC], 
        'desc' => ['quotation_status' => SORT_DESC], 
        'label' => 'quotation_status', 
       ], 
       'is_confirm' => [ 
        'asc' => ['is_confirm' => SORT_ASC], 
        'desc' => ['is_confirm' => SORT_DESC], 
        'label' => 'is_confirm', 
       ], 
       'net_total' => [ 
        'asc' => ['net_total' => SORT_ASC], 
        'desc' => ['net_total' => SORT_DESC], 
        'label' => 'net_total', 
       ], 
       'doc_date' => [ 
        'asc' => ['doc_date' => SORT_ASC], 
        'desc' => ['doc_date' => SORT_DESC], 
        'label' => 'doc_date', 
       ], 
      ], 
     ], 
     'pagination' => [ 
      'pageSize' => 25, 
     ], 
    ]); 

    $models = $dataProvider->getModels(); 

    if (!$this->validate()) { 
     // uncomment the following line if you do not want to any records when validation fails 
     // $query->where('0=1'); 
     return $dataProvider; 
    } 

    return $dataProvider; 
} 
+0

Если кто-то знает, как создать gridview из sql-процедуры, так PLZ отметить – Dani

+1

Попробуйте выполнить SQL-запросы отдельно (за пределами GridView) для получения данных (с применением фильтров), а также для подсчета и просмотра времени выполнения. Вы можете использовать 'EXPLAIN' для более глубокого изучения. Также вы можете использовать панель отладки Yii и консоль браузера, возможно, это не проблема с базой данных, но, например, проблема загрузки ресурсов. – arogachev

ответ

0

Попытка, чтобы удалить избыток вызова метода:

$models = $dataProvider->getModels(); 

Упрощение оценки общего количества (столбец только для использования PK вместо *):

$pages = clone $query; 
$pages->select('COUNT(*) count'); 
$pages = $pages->createCommand()->queryAll(); 
$pages = $pages[0]; 

// ... 

'totalCount' => $pages['count'], 

заменить на:

$queryClone = clone $query; 
$totalCount = $queryClone->count('[[id]]');  // where [[id]] is PrimaryKey 

Постарайтесь добавить индексы для столбцов, которые используются в инструкции/order_by.

Также используйте debug extensions для профилирования SQL-запросов. Он показывает время выполнения каждого SQL-запроса и позволяет выполнить команду EXPLAIN для каждого запроса.

Смежные вопросы