MySQL запросы истекают на MySQL Workbench

0

InnoDB MySQL 5.7

Привет всем, как говорится в заголовке, запросы, которые я использовал, синхронизируются с MySQL Workbench. Я использую те же запросы, что и неделю назад, но вместо того, чтобы принимать 0,5 с, они берут 15-25 секунд. Примером может служить следующее:

SELECT * FROM <table> ORDER BY <time column> DESC;

В другой заметке я использую довольно длинные запросы MySQL, чтобы собрать некоторые приблизительные статистические данные из этих данных, которые, как я полагаю, займет больше времени, но я не уверен, есть ли лучший способ сделать это. Я должен также упомянуть, что у меня только сейчас есть разрешения SELECT/SHOW. Вот длинный запрос, который синхронизируется:

SELECT DATE(<time_sent_column>) as Update_Date, 
ABS(AVG(UNIX_TIMESTAMP(<time_created_column>) - UNIX_TIMESTAMP(<time_sent_column>))) AS AVG_Latency,
AVG((SELECT 
    ABS(AVG(UNIX_TIMESTAMP(<time_created_column>) - UNIX_TIMESTAMP(<time_sent_column>))) 
    FROM <table_name> 
    WHERE ((UNIX_TIMESTAMP(<time_created_column>) - UNIX_TIMESTAMP(<time_sent_column>) < 10800))))
AS Total_Average_Latency,
STDDEV(UNIX_TIMESTAMP(<time_created_column>) - UNIX_TIMESTAMP(<time_sent_column>)) as STDDEV_Latency,
AVG((SELECT 
    ABS(STDDEV(UNIX_TIMESTAMP(<time_created_column>) - UNIX_TIMESTAMP(<time_sent_column>))) 
    FROM <table_name> 
    WHERE ((UNIX_TIMESTAMP(<time_created_column>) - UNIX_TIMESTAMP(<time_sent_column>) < 10800))))
AS Total_STDDEV_Latency,
VAR_SAMP(UNIX_TIMESTAMP(<time_created_column>) - UNIX_TIMESTAMP(create_date)) as Variance_Latency,
AVG((SELECT 
    ABS(VAR_SAMP(UNIX_TIMESTAMP(<time_created_column>) - UNIX_TIMESTAMP(<time_sent_column>))) 
    FROM <table_name>
    WHERE ((UNIX_TIMESTAMP(<time_created_column>) - UNIX_TIMESTAMP(<time_sent_column>) < 10800))))
AS Average_Variance_Latency,
MIN(ABS((UNIX_TIMESTAMP(<time_created_column>) - UNIX_TIMESTAMP(<time_sent_column>)))) AS Min_Latency,
MAX(ABS((UNIX_TIMESTAMP(<time_created_column>) - UNIX_TIMESTAMP(<time_sent_column>)))) AS Max_Latency
FROM <table_name>
WHERE ((ABS(UNIX_TIMESTAMP(<time_created_column>) - UNIX_TIMESTAMP(<time_sent_column>)) < 10800) AND created_at > '2018-05-01')
GROUP BY DATE(<time_created_column>)
ORDER BY DATE(<time_created_column>) DESC;

Я мог бы сломать все это, однако я бы предпочел, чтобы они были в одной таблице после запроса, если это возможно. Я новичок в MySQL, поэтому я не уверен, могу ли я использовать JOINs или что-то в этом JOINs это сортировка только с разрешениями SELECT/SHOW.

База данных составляет 50% от ее соединений, минимальный трафик, 98,7% эффективности ключа, 87,5% использования буфера InnoDB, 0 чтений/записей в секунду.. Любые советы были бы замечательными! Спасибо!

  • 0
    Вы долго работаете, потому что сканируете всю таблицу в своих подзапросах.
  • 0
    Как я могу ограничить это только определенной точкой данных, которую он рассчитывает? На самом деле я не знаю другого способа сделать это .. Я хочу, чтобы некоторые результаты отображали результат для каждого дня, но затем некоторые, такие как "Average_Variance_Latency", чтобы показать один результат, который является продуктом всех данных. установлено .. Я разделил значения ежедневной задержки и стандартное отклонение / дисперсию на отдельные запросы, однако даже когда я запрашиваю ТОЛЬКО общую среднюю задержку, которую я рассчитал на 30 с ..
Показать ещё 3 комментария
Теги:
mysql-workbench
innodb

1 ответ

0

(В приведенном ниже time_created я предполагаю, что time_created меньше, чем time_sent, отрегулируйте код, если это не заданный.)

Я начну с

CREATE TEMPORARY TABLE t
    SELECT DATE(time_sent)    AS Update_Date,
           DATE(time_created) AS Created_Date,
           UNIX_TIMESTAMP(time_sent) - UNIX_TIMESTAMP(time_created)) AS Latency
        FROM table_name
        WHERE UNIX_TIMESTAMP(time_sent) - UNIX_TIMESTAMP(time_created)) < 10800
          AND created_at > '2018-05-01';

а затем построить запрос из этой таблицы temp. В следующем запросе потребуется намного меньше нажатий клавиш. И ему не нужны никакие подзапросы.

(Я предполагаю, что create_date была опечаткой?)

(Возможно, вы хотите >= в created_at > '2018-05-01';)

Обратите внимание, что тест для < 10800, вероятно, избыточен во всех выражениях, отличных от WHERE.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню