MySQL запрос неожиданно завершается навсегда - PullRequest
0 голосов
/ 18 февраля 2020

У меня проблема со старым приложением Symfony 2. Внезапно, когда пользователь нажимает на вкладку «Заказы», ​​отображение списка занимает более 5 минут, а раньше это занимало не более 3 секунд. Это запрос с планом выполнения:

EXPLAIN 
SELECT DISTINCT s0_.id AS id0 
              , SUM(s1_.price * s1_.amount) AS sclr1
              , SUM(s1_.price * s1_.amount * s1_.tax) AS sclr2
              , SUM(s1_.price * s1_.amount * s1_.retax) AS sclr3
              , s0_.id AS id4 
           FROM stncrp_order s0_ 
           JOIN stncrp_store s2_ 
             ON s0_.store_id = s2_.id 
           LEFT 
           JOIN stncrp_orderline s1_ 
             ON s0_.id = s1_.order_id 
            AND s1_.rejected = 0
           LEFT 
           JOIN stncrp_order_provider_warn s3_ 
             ON s0_.id = s3_.order_id 
          WHERE s0_.state >= 3 
          GROUP 
             BY s0_.id
              , s0_.date
              , s0_.shipment_limit_date
              , s0_.state
              , s0_.state_changed_date
              , s0_.received
              , s0_.shipment_cost
              , s0_.username
              , s0_.notes
              , s0_.user_id
              , s0_.store_id
              , s0_.storedata_id
              , s3_.id
              , s3_.createdDate
              , s3_.comments
              , s3_.order_id 
          ORDER 
             BY s0_.id DESC 
          LIMIT 10 
         OFFSET 0;
+----+-------------+-------+--------+----------------------+----------------------+---------+---------------------+-------+----------------------------------------------+
| id | select_type | table | type   | possible_keys        | key                  | key_len | ref                 | rows  | Extra                                        |
+----+-------------+-------+--------+----------------------+----------------------+---------+---------------------+-------+----------------------------------------------+
|  1 | SIMPLE      | s0_   | ALL    | IDX_F4A5D9B092A811   | NULL                 | NULL    | NULL                | 19633 | Using where; Using temporary; Using filesort |
|  1 | SIMPLE      | s2_   | eq_ref | PRIMARY              | PRIMARY              | 4       | est_db.s0_.store_id |     1 | Using index                                  |
|  1 | SIMPLE      | s1_   | ref    | IDX_252BF9D78D9F6D38 | IDX_252BF9D78D9F6D38 | 5       | est_db.s0_.id       |     3 |                                              |
|  1 | SIMPLE      | s3_   | ref    | IDX_20FC41F28D9F6D38 | IDX_20FC41F28D9F6D38 | 5       | est_db.s0_.id       |     1 |                                              |
+----+-------------+-------+--------+----------------------+----------------------+---------+---------------------+-------+----------------------------------------------+

Вот список процессов на сервере прямо сейчас:

mysql> show processlist;
+-----+------+-----------------+--------+---------+------+---------------------+------------------------------------------------------------------------------------------------------+
| Id  | User | Host            | db     | Command | Time | State               | Info                                                                                                 |
+-----+------+-----------------+--------+---------+------+---------------------+------------------------------------------------------------------------------------------------------+
| 185 | root | localhost:52066 | est_db | Sleep   | 4877 |                     | NULL                                                                                                 |
| 186 | root | localhost:52068 | est_db | Sleep   | 4885 |                     | NULL                                                                                                 |
| 209 | root | localhost:52176 | est_db | Sleep   |   31 |                     | NULL                                                                                                 |
| 242 | root | localhost       | est_db | Query   |    0 | NULL                | show processlist                                                                                     |
| 248 | root | localhost:52368 | est_db | Query   | 1525 | Removing duplicates | SELECT DISTINCT s0_.id AS id0, SUM(s1_.price * s1_.amount) AS sclr1, SUM(s1_.price * s1_.amount * s1 |
+-----+------+-----------------+--------+---------+------+---------------------+------------------------------------------------------------------------------------------------------+

Запрос генерируется «волшебным образом» следующим методом:

/**
 * @Route("/admin/order/index", name="mainbundle_admin_orderentity")
 * @Template()
 */
public function orderAjaxListAction()
{
    $searchform = $this->searchForm(
        $this->createForm(new OrderEntitySearchType())
    );
    $em    = $this->getDoctrine()->getManager();
    $qb = $em->getRepository('StoreBundle:OrderEntity')->findByCriteria($searchform->getData());
    return $this->index('OrderEntity', $qb, $searchform, 't.id', 'DESC');
}

Никто ничего не изменил в коде приложения или базе данных, и он работал прекрасно до последней пятницы ... В чем может быть причина?

Заранее спасибо,

1 Ответ

0 голосов
/ 19 февраля 2020

Скорее всего, на стороне просмотра, если вы попытались запросить объект с ассоциациями, отложенная загрузка создаст дополнительный запрос для каждой итерации, поэтому он будет очень медленным, если у вас будет больше данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...