Утилита Golang, которая может уменьшать количество точек данных в день в таблице с историческими данными.
Диапазон записей составляет от 20 до 400 записей в день.всего существует как минимум 100 миллионов записей.
Утилита может урезать ее до n записей в день до указанной даты.(n может варьироваться от 1 до 300 записей в день)
Я использую следующий метод:
ШАГ 1:
CREATE TABLE main_table_tmp LIKE main_table;
ШАГ 2:
ALTER TABLE main_table_tmp ADD COLUMN timekey INT;
ШАГ 3:
INSERT INTO main_table_tmp
SELECT * FROM (
SELECT *,FLOOR(UNIX_TIMESTAMP(column_name)/((1440/2)*60)) AS timekey
FROM main_table
WHERE column_name <= '2018-01-01'
GROUP BY timekey
) m
UNION ALL
(SELECT * ,0 As timekey FROM main_table where column_name > 'date') ;
ШАГ 4:
ALTER TABLE main_table_tmp DROP COLUMN timekey;
DROP TABLE maintable;
RENAME TABLE maintable_tmp TO maintable;
Я добиваюсь вышеизложенного с помощью golang.
func somefuncname(){
----
----
----
q := "CREATE TABLE " + *tablename + "_tmp LIKE " + *tablename + ";"
rows, err := db.Query(q)
if err != nil {
fmt.Println(err)
}
//--ALTER ADD timekey
//--INSERT INTO SELECT *....
//--ALTER DROP timekey ,DROP table and rename
}
Текущее время ответа на этот запрос очень медленное
Некоторые результаты: Всего записей: 2 миллиона
Время выполнения: 180 секунд
Это на 16 ГБ ОЗУ. Процессор очень медленный, когда он развернут в низкокачественной системе
У меня есть шагипотребовалось решить это:
Посмотрел индексы всех таблиц.Попробовал удалить индекс и запустить утилиту.Удаление индексов ускорило работу утилиты на 5 секунд, что также немного.
Выполнение утилиты поэтапно: если общее количество записей превышает 1 миллион, запускайте утилиту по миллиону за раз
Но после всех этих попыток похоже, что основная проблема заключается в самом запросе.
Это просто недостаточно быстро.Мне просто нужен способ повысить эффективность запроса
Любая помощь оценена, спасибо, ребята !!