|
trigger по дате или с датой....
|
|||
---|---|---|---|
#18+
Всем привет. Подскажите кто сможет (если конечно такое возможно) есть таблица 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 (...... но почему то так не получается...... подскажите как можно? или может вообще по другому? в имя таблицы переменные можно подставлять, и как? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.03.2021, 17:09 |
|
trigger по дате или с датой....
|
|||
---|---|---|---|
#18+
kravit, штатное партицирование по дате и использзуйте: https://dev.mysql.com/doc/refman/8.0/en/partitioning.html ... |
|||
:
Нравится:
Не нравится:
|
|||
15.03.2021, 17:50 |
|
trigger по дате или с датой....
|
|||
---|---|---|---|
#18+
Спасибо за подсказку. Нашел отличную статью по 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 месяца.... я правильно понимаю? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.03.2021, 22:00 |
|
trigger по дате или с датой....
|
|||
---|---|---|---|
#18+
kravit Например я создал партиции по два дня (как в примере) kravit что произойдет когда наступит следующий месяц и числа начнут заново....? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.03.2021, 07:54 |
|
trigger по дате или с датой....
|
|||
---|---|---|---|
#18+
Спасибо за критику. Если честно я не до конца понимаю как оно работает. Но первое: мне не нужен год. я удаляю данные позже 2 месяцев. у меня каждый день по 800000 записей логов записывается в таблицу. Проблема в том что сейчас уже 11000000 записей и web морда естественно очень долго думает при запросе хотя в ней показываются первые 30 строк и тд.... я вообще хотел на каждый день новую таблицу Events_day_01.....Events_day_31 но web морда обращается только к таблице Events... и я хотел триггером при запросе в зависимости от числа дня обращаться к нужой таблице например: web морда обращается к таблице Events и сегодня 17 число то триггер будет делать запрос к Events_day_17 как по INSERT так и по SELECT Такое можно сделать? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.03.2021, 12:47 |
|
trigger по дате или с датой....
|
|||
---|---|---|---|
#18+
kravit web морда естественно очень долго думает при запросе ... |
|||
:
Нравится:
Не нравится:
|
|||
17.03.2021, 15:27 |
|
trigger по дате или с датой....
|
|||
---|---|---|---|
#18+
Если kravit web морда обращается только к таблице Events и генеримые веб-мордой запросы неподконтрольны, то не факт, что партиционирование поможет. Изучите внимательно https://dev.mysql.com/doc/refman/8.0/en/partitioning-pruning.html - точно ли тексты запросов таковы, что сервер сможет определить необходимость работать только с частью разделов? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.03.2021, 15:32 |
|
trigger по дате или с датой....
|
|||
---|---|---|---|
#18+
В общем не очень помогает партиции. Поэтому я больше склоняюсь к триггеру который будет автоматически пересылать данные с основной таблицы 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; ... |
|||
:
Нравится:
Не нравится:
|
|||
18.03.2021, 14:33 |
|
|
start [/forum/topic.php?fid=47&fpage=10&tid=1828144]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
35ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
50ms |
get tp. blocked users: |
2ms |
others: | 229ms |
total: | 362ms |
0 / 0 |