MySQL Оптимизация: DISTINCT слишком медленный - PullRequest
1 голос
/ 12 февраля 2020

У меня есть запрос с формой

SELECT COUNT(*)
FROM 
   table1, table2, table3, table4, table5, table6
where (several conditions to join the tables)

, выполнение которого занимает несколько минут (результирующий счет - 2000 миллионов).

Проблема заключается в том, что при добавлении DISTINCT как здесь:

SELECT COUNT(  DISTINCT field1, field2, field3, field4, field5   )
FROM 
   table1, table2, table3, table4, table5, table6
where (several conditions to join the tables)

Выполнение продолжается более 3 часов.

Кажется, проблема в операции DISTINCT, поскольку условия JOIN одинаковы в обеих версиях. Есть ли способ оптимизировать исполнение версии DISTINCT?

Спасибо!

Ответы [ 3 ]

2 голосов
/ 12 февраля 2020

Для выполнения которого требуется несколько минут (результирующий счет составляет 2000 миллионов).

Чтобы обработать count(distinct), MySQL придется отсортировать 2 Миллиард строк. Это много данных.

Это занимает много и много времени. Вы ничего не можете с этим поделать, если только вы не можете изменить запрос, чтобы промежуточные данные не были такими большими.

1 голос
/ 12 февраля 2020

Без изменения оператора SQL или без изменения структуры таблиц (например, добавление некоторых индексов или некоторых новых промежуточных сводных таблиц), вероятно, не получится запустить версию запроса DISTINCT для выполнения. быстрее.

Вероятно, "большой камень" с точки зрения прошедшего времени - это операция "Использование файловой сортировки". Мы используем EXPLAIN, чтобы увидеть план выполнения запроса; это первый быстрый шаг для нас, чтобы узнать, какие операции MySQL выполняет, в каком порядке.

В MySQL и MariaDB есть некоторые системные параметры, которые можно настроить, например, выделив больше памяти для временных наборов, которые должны храниться в ПАМЯТИ перед разливом на диск; но маловероятно, что есть волшебный твик c, который исправит проблему производительности с 2 миллиардами строк. И всегда есть возможность использовать более качественное оборудование для решения этой проблемы.

Если вы готовы изменить оператор SQL или выполнить несколько операторов, то может быть возможность для настройки.

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

Вы пытались объединить левых с новым избранным статусом, содержащим только слово <1002 *? </p>

...