Выполнение этого запроса быстрее (порядок по целому столбцу) - PullRequest
0 голосов
/ 09 января 2019

Я пытаюсь извлечь строки из таблицы базы данных и предпочитаю, чтобы они имели provider_count выше 0. Я хочу получить записи с provider_count ниже 0 в качестве последних результатов.

В настоящее время я использую следующий запрос к таблице с записями около 1М:

SELECT
    `products`.*
FROM
    `products`
WHERE
    `products`.`provider_count` IN
    (12,2,3,4,5,6,7,8,9,10,11,13,14,18,19,21,22,42,46,58,0)
GROUP BY
    `products`.`search_name`
ORDER BY
    FIELD(provider_count, 12,2,3,4,5,6,7,8,9,10,11,13,14,18,19,21,22,42,46,58,0)
LIMIT 48

К сожалению, порядок выполнения делает запрос действительно медленным, в столбце provider_count уже есть индекс, и я попытался добавить индекс к provider_count + search_name, но это не показало каких-либо улучшений в отношении скорости.

Я также пытался изменить порядок, удалив оператор WHERE и изменив ORDER BY на:

ORDER BY `products`.`provider_count` = 0 ASC, `products`.`provider_count`

Но это приводит к примерно одинаковому времени выполнения (5 или 5 секунд). Без заказа на время выполнения запроса составляет всего 0,005 с

Есть предложения по улучшению этого запроса?

Схема таблицы моих продуктов: https://www.db -fiddle.com / ж / azBzXiRRsLtXCmLDCVe9DP / 0

1 Ответ

0 голосов
/ 11 января 2019

Я собираюсь попытаться ответить - до сих пор не совсем ясно, что должен делать ваш запрос. Предоставленная вами скрипта не выполняет ваш запрос (из-за упомянутой ошибки GROUP BY @rickJames).

Я полагаю, что вы намереваетесь получить все записи в таблице продуктов для получения списка поставщиков. Вы хотите, чтобы записи, где провайдер равен 0, были в конце этого списка. Вы хотите, чтобы запрос выполнялся быстро.

Вы сможете достичь этого с помощью этого запроса:

SELECT
    `products`.*, 1 as no_provider
FROM
    `products`
WHERE
    `products`.`provider_count` IN
    (12,2,3,4,5,6,7,8,9,10,11,13,14,18,19,21,22,42,46,58)

union
SELECT
    `products`.*, 2 as no_provider
FROM
    `products`
WHERE
    `products`.`provider_count` = 0
order by no_provider, provider_count
LIMIT 48

Ваше предельное предложение означает, что если имеется более 48 записей с числом провайдеров> 0, последнее предложение не будет отображаться в вашем наборе результатов.

Конечно, вы могли бы сделать это еще проще:

SELECT
    `products`.*
FROM
    `products`
WHERE
    `products`.`provider_count` IN
    (12,2,3,4,5,6,7,8,9,10,11,13,14,18,19,21,22,42,46,58,0)
ORDER BY provider_count desc
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...