Оптимизация запроса MySQL SELECT с подзапросами - PullRequest
0 голосов
/ 02 апреля 2020

Привет, можно ли оптимизировать запрос SELECT ниже? Сам запрос работает, но когда мы запрашиваем большие данные, мы сталкиваемся с сообщением в php, которое гласит: «Превышено максимальное время выполнения 30 секунд». Я уменьшил столбцы в запросе до Topping3, но запрашиваю до Topping15 столбца.

SELECT 
    itemID,
    itemName,
    Topping1,
    (SELECT DISTINCT Description FROM items WHERE PLU = a.Topping1 AND ClientID = 1679) AS Top1_desc,
    Topping2,
    (SELECT DISTINCT Description FROM items WHERE PLU = a.Topping2 AND ClientID = 1679) AS Top2_desc,
    Topping3,
    (SELECT DISTINCT Description FROM items WHERE PLU = a.Topping2 AND ClientID = 1679) AS Top3_desc,
FROM
    items a
WHERE
    ...

Текущие данные в items таблице

--------------------------------------------------------------------
| itemID | itemName | Description | Topping1 | Topping2 | Topping3 |
--------------------------------------------------------------------
|    1   |   HAM1   |  Hamburger  |   ONI1   |   TOMO1  |          |
--------------------------------------------------------------------
|    2   |   ONI1   |    Onion    |          |          |          |
--------------------------------------------------------------------
|    3   |   TOMO1  |   Tomato    |          |          |          |
--------------------------------------------------------------------

, и это это ожидаемый результат

--------------------------------------------------------------------------------------------------------
| itemID | itemName | Description | Topping1 | Top1_desc | Topping2 | Top2_desc | Topping3 | Top3_desc |
--------------------------------------------------------------------------------------------------------
|    1   |   HAM1   |  Hamburger  |   ONI1   |   Onion   |   TOMO1  |  Tomato   |          |          |
--------------------------------------------------------------------------------------------------------
|    2   |   ONI1   |    Onion    |          |           |          |           |          |          |
--------------------------------------------------------------------------------------------------------
|    3   |   TOMO1  |   Tomato    |          |           |          |           |          |          |
--------------------------------------------------------------------------------------------------------

1 Ответ

1 голос
/ 02 апреля 2020

Это должно быть быстро, если не много записей с одинаковым идентификатором клиента. Вы можете добавить LIMIT 1 после всех подзапросов, то есть: (SELECT DISTINCT Description FROM items WHERE PLU = a.Topping1 AND ClientID = 1679 LIMIT 1) et c.

Я подозреваю, однако, что это проблема индекса. Индексируются ли поля ClientID и PLU?

РЕДАКТИРОВАТЬ: Альтернатива для вашего запроса:

SELECT 
    itemID,
    itemName,
    Topping1,
    t1.Description AS Top1_desc,
    Topping2,
    t2.Description AS Top2_desc,
    Topping3,
    t3.Description AS Top3_desc,
FROM
    items a
LEFT JOIN
    items t1 ON t1.PLU=a.Topping1 AND t1.ClientID = 1679
LEFT JOIN
    items t2 ON t2.PLU=a.Topping2 AND t2.ClientID = 1679
LEFT JOIN
    items t3 ON t3.PLU=a.Topping3 AND t3.ClientID = 1679
WHERE
    ...
GROUP BY
    a.itemID

Поля itemID, PLU и ClientID нуждаются в индексах .

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