Удалить используя временный и Filesort из выполнения запроса - PullRequest
0 голосов
/ 30 мая 2018

У меня есть одна таблица, имеющая почти 90 столбцов, и использующая Range Range.Эта таблица содержит почти 50 лаков записей.Когда в то время я использовал GROUP BY в Query, он показывает «использование временного» и «filesort» в операторе объяснения.

Запрос:

 SELECT
 subscribe_time * 0.000001 AS start_date,
 subscribe_time * 0.000001 AS end_date,
 (
    IFNULL(
      ROUND(
         SUM(
          CASE WHEN(
              subscribe_duration > 20000 AND subscribe_status = '1'
              ) THEN 1 ELSE 0
          END
          ) /(
            SUM(
              CASE WHEN(subscribe_status = '1') THEN 1 ELSE 0
              END
           )
      ) * 100,
    2
  ),
  0
)
) AS subscribe_avg

FROM
  tbl_subscription a
WHERE
  1 AND subscribe_time > 0 AND subscribe_time BETWEEN "1525113000000000" AND "1524680999999999"
GROUP BY
  EXTRACT(
    YEAR
    FROM
       FROM_UNIXTIME(subscribe_time * 0.000001)
    ),
  EXTRACT(
    MONTH
    FROM
    FROM_UNIXTIME(subscribe_time * 0.000001)
  ),
  EXTRACT(
     WEEK
     FROM
     FROM_UNIXTIME(subscribe_time * 0.000001)
 ),
 EXTRACT(
   DAY
   FROM
   FROM_UNIXTIME(subscribe_time * 0.000001)
),
sub_user,
subscribe_ip,
subscribe_zone,
subscribe_approval

Индексирование уже задано для field1.field1 не наш ПК.В общей сложности 5 столбцов индексации.

Когда я пишу GROUP BY запрос занимает почти 43 секунды для выполнения.и когда я удаляю GROUP BY в то время, это занимает 0,27 сек.

Также, когда мы наконец напишем «ORDER BY NULL», сортировка файлов будет удалена.Но я не хочу использовать ORDER BY в своем запросе.Как сократить время выполнения запроса?

Кроме того, я также пытался извлечь данные из одного раздела, но запрос все еще занимает то же время.Запрос на выборку данных из одного раздела:

 SELECT field1, field2 FROM TABLE_NAME PARTITION(p1) WHERE 1 AND 
   field1='SOME_VALUE' GROUP BY field1;

Дайте несколько советов по сокращению времени выполнения запроса.

1 Ответ

0 голосов
/ 01 июня 2018

Первое выражение GROUP BY, вероятно, может быть заменено на

subscribe_time

или, возможно,

FLOOR(subscribe_time * 0.000001)

Я не вижу необходимости разбивать его на части, только чтобы выполнить GROUP BY.

Можете ли вы предоставить SHOW CREATE TABLE?- Нам нужно увидеть индексы, разделы и, возможно, другие детали.В частности, имеет ли он или оба

PARTITION BY RANGE(subscribe_time)
INDEX(subscribe_time)
...