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 чтений/записей в секунду.. Любые советы были бы замечательными! Спасибо!
(В приведенном ниже 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
.