powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / trigger по дате или с датой....
8 сообщений из 8, страница 1 из 1
trigger по дате или с датой....
    #40053733
kravit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет.
Подскажите кто сможет (если конечно такое возможно)
есть таблица Events, по ее подобию сделал таблицу Events_old и для нее сделал trigeer

DELIMITER #
CREATE TRIGGER copy_in_mouth AFTER INSERT ON Events
FOR EACH ROW
BEGIN
INSERT INTO Events_old
(CustomerID,
ReceivedAt,
DeviceReportedTime,
Facility,
Priority,
FromHost,
Message,
NTSeverity,
Importance,
EventSource,
EventUser,
EventCategory,
EventID)
VALUE new.CustomerID,
new.ReceivedAt,
new.DeviceReportedTime,
new.Facility,
new.Priority,
new.FromHost,
new.Message,
new.NTSeverity,
new.Importance,
new.EventSource,
new.EventUser,
new.EventCategory,
new.EventID);
END#
DELIMITER ;

все отлично работает но я подумал а если имя таблицы к дате привязать.....
то есть к примеру в основную таблицу Events пишется данные....
триггер при действии insert копирует эти данные в таблицу Events_(число месяца)
например если сейчас 03 месцяц значит Events_03
и как только месяц 04 то автоматом триггер пишет Events_04 и тд....

CREATE TRIGGER copy_in_mouth AFTER INSERT ON Events
FOR EACH ROW
BEGIN
set @mouth = MONTH(SYSDATE());
INSERT INTO Events_@mouth
(......

но почему то так не получается......
подскажите как можно?
или может вообще по другому?

в имя таблицы переменные можно подставлять, и как?
...
Рейтинг: 0 / 0
trigger по дате или с датой....
    #40053759
Melkij
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kravit,

штатное партицирование по дате и использзуйте: https://dev.mysql.com/doc/refman/8.0/en/partitioning.html
...
Рейтинг: 0 / 0
trigger по дате или с датой....
    #40054335
kravit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за подсказку. Нашел отличную статью по Mysql PARTITION BY YEAR(date) / MONTH(date) / DAYOFWEEK(date)
на хабре...
https://habr.com/ru/post/159131/

Но теперь у меня следующий вопрос?
Например я создал партиции по два дня (как в примере)

ALTER TABLE Events PARTITION BY LIST (DAY(DeviceReportedTime))
(
PARTITION p00 VALUES IN (0,1) ,
PARTITION p02 VALUES IN (2,3) ,
PARTITION p04 VALUES IN (4,5) ,
PARTITION p06 VALUES IN (6,7) ,
PARTITION p08 VALUES IN (8,9) ,
PARTITION p10 VALUES IN (10,11),
PARTITION p12 VALUES IN (12,13),
PARTITION p14 VALUES IN (14,15),
PARTITION p16 VALUES IN (16,17),
PARTITION p18 VALUES IN (18,19),
PARTITION p20 VALUES IN (20,21),
PARTITION p22 VALUES IN (22,23),
PARTITION p24 VALUES IN (24,25),
PARTITION p26 VALUES IN (26,27),
PARTITION p28 VALUES IN (28,29),
PARTITION p30 VALUES IN (30,31)
);

все отлично создалось и работает, но что произойдет когда наступит следующий месяц и числа начнут заново....?
получается что в порции (например PARTITION p02 VALUES IN (2,3) ) лежит 2 и 3 число 03 месяца
а потом когда наступит 04 месяц то в этой же портиции будет 2 и 3 число 04 месяца....
я правильно понимаю?
...
Рейтинг: 0 / 0
trigger по дате или с датой....
    #40054409
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kravit
Например я создал партиции по два дня (как в примере)
Ну хрень же голимая. Ты ж никогда не будешь выбирать записи по номеру дня, плюя при этом на месяц и год - ну и нахрена тогда такое партиционирование? В чём смысл его вообще? да в том, чтобы (в зависимости от условий отбора) обрабатывать только определённые партиции, и не обращаться к тем, которые не соответствуют условиям отбора. Так что партиционировать надо по дате (по месяцу-году, например).

kravit
что произойдет когда наступит следующий месяц и числа начнут заново....?
У Вас ВСЕГДА должна существовать партиция для будущих периодов.
...
Рейтинг: 0 / 0
trigger по дате или с датой....
    #40054531
kravit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за критику. Если честно я не до конца понимаю как оно работает.
Но первое:
мне не нужен год. я удаляю данные позже 2 месяцев.
у меня каждый день по 800000 записей логов записывается в таблицу.
Проблема в том что сейчас уже 11000000 записей и web морда естественно очень долго думает при запросе хотя в ней показываются первые 30 строк и тд....
я вообще хотел на каждый день новую таблицу Events_day_01.....Events_day_31
но web морда обращается только к таблице Events...
и я хотел триггером при запросе в зависимости от числа дня обращаться к нужой таблице
например: web морда обращается к таблице Events и сегодня 17 число то триггер будет делать запрос к Events_day_17
как по INSERT так и по SELECT
Такое можно сделать?
...
Рейтинг: 0 / 0
trigger по дате или с датой....
    #40054618
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kravit
web морда естественно очень долго думает при запросе
Каким именно запросом она отбирает данные? И есть ли возможность этот запрос изменить?
...
Рейтинг: 0 / 0
trigger по дате или с датой....
    #40054621
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если
kravit
web морда обращается только к таблице Events

и генеримые веб-мордой запросы неподконтрольны, то не факт, что партиционирование поможет. Изучите внимательно https://dev.mysql.com/doc/refman/8.0/en/partitioning-pruning.html - точно ли тексты запросов таковы, что сервер сможет определить необходимость работать только с частью разделов?
...
Рейтинг: 0 / 0
trigger по дате или с датой....
    #40054934
kravit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В общем не очень помогает партиции.
Поэтому я больше склоняюсь к триггеру который будет автоматически пересылать данные с основной таблицы Events в таблицу с именем числа дня или месяца (Events_day_01...Events_day_31, Events_month_01...Event_month_12).
Изменить настройки web морды не смогу так как я не знаю php и я пытался разобраться в коде где там указывается откуда брать но увы..... В общем решил бороться с базой данных...

еще заметил такую фишку что web морда хорошо работает и выбирает до 1-2 миллионов строк, дальше уже начинает тормозить.

Поэтому решил сделать так:
Есть основная таблица Events в нее будут записываться данные и с помощью триггера копироваться в другую таблицу с именем дня,
далее, каждый день в 00:00 часов делаю

TRUNCATE TABLE Events;

так как в основном нужно смотреть данные за текущий день.

а если вдруг понадобится прошлый день или позапрошлый

то будет процедура (или функция) которая будет просто копировать данные из таблиц Events_day_01...Events_day_31 в рабочую таблицу Events, ну и естественно каждый день TRUNCATE TABLE Events.

Наверное писец как не правильно и глупо но пока другого варианта я не нашел.

уже даже пример триггера есть:

DELIMITER #
CREATE TRIGGER copy_in_day AFTER INSERT ON Events
FOR EACH ROW
BEGIN
SET @d = DATE_FORMAT(SYSDATE(), "%d");
SET @z = CONCAT("INSERT INTO Events_day_",@d,"
(CustomerID,
ReceivedAt,
DeviceReportedTime,
Facility,
Priority,
FromHost,
Message,
NTSeverity,
Importance,
EventSource,
EventUser,
EventCategory,
EventID)
VALUE new.CustomerID,
new.ReceivedAt,
new.DeviceReportedTime,
new.Facility,
new.Priority,
new.FromHost,
new.Message,
new.NTSeverity,
new.Importance,
new.EventSource,
new.EventUser,
new.EventCategory,
new.EventID)");
PREPARE EXEC FROM @z;
EXECUTE EXEC;
END#
DELIMITER ;

но почему-то выдает ошибку,

Sorry an unexpected error happened!

помогите разобраться

если без триггера то все работает

set @d = DATE_FORMAT(SYSDATE(), "%d");
set @z = CONCAT("insert into Events_day_",@d," (ReceivedAt) VALUES (SYSDATE())");
prepare exec from @z;
execute exec;
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / trigger по дате или с датой....
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]