Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / MySQL Новый топик    Ответить
 Дилетантский вопрос для повышения самообразованности  [new]
Nick-name
Member

Откуда:
Сообщений: 667
Например есть пять приложений, допустим парсеры, или, что-то подобное, то что должно делать много инсертов.
С точки зрения базы как лучше, если они инсертят в одну таблицу или каждый в свою, или для базы это монопенисуально?
13 фев 20, 22:56    [22079643]     Ответить | Цитировать Сообщить модератору
 Re: Дилетантский вопрос для повышения самообразованности  [new]
miksoft
Member

Откуда:
Сообщений: 37995
С точки зрения базы лучше, если они будут писать в файлы. А в саму базу вставлять либо последовательно в одну таблицу, либо в разные таблицы пакетно из файла командой mysqlimport/LOAD DATA INFILE.
14 фев 20, 00:40    [22079675]     Ответить | Цитировать Сообщить модератору
 Re: Дилетантский вопрос для повышения самообразованности  [new]
Nick-name
Member

Откуда:
Сообщений: 667
А как быть с unique индексами в случае с LOAD DATA INFILE, или они учитываются. Просто включать и выключать их помоему не вариант.? Я просто не пользовался никогда таким способом.
14 фев 20, 06:58    [22079712]     Ответить | Цитировать Сообщить модератору
 Re: Дилетантский вопрос для повышения самообразованности  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20009
Nick-name
А как быть с unique индексами в случае с LOAD DATA INFILE, или они учитываются.
LOAD DATA INFILE работает с ограничениями особым способом - по причине отключения механизма транзакций. Ошибка прерывает процесс, но то, что записано ранее - сохраняется.

Nick-name
С точки зрения базы как лучше, если они инсертят в одну таблицу или каждый в свою, или для базы это монопенисуально?
Серверу конечно, лучше, когда каждый пишет в свою таблицу - но это явный косяк с точки зрения нормализации. Решением проблемы нормализации (ценой производительности, конечно) может быть объявление этих таблиц как RAW DATA - т.е. парсер пишет туда, а затем серверная хранимая процедура перемещает данные в рабочую таблицу, одну на всех.

Nick-name
то что должно делать много инсертов.

Много - это сколько? Опять же - запись не по одной, а чанками по, скажем, десять, сразу уменьшает количество запросов на порядок.
14 фев 20, 07:35    [22079715]     Ответить | Цитировать Сообщить модератору
 Re: Дилетантский вопрос для повышения самообразованности  [new]
Nick-name
Member

Откуда:
Сообщений: 667
если честно, у меня такая задумка и была

парсер пишет туда, а затем серверная хранимая процедура перемещает данные в рабочую таблицу, одну на всех.

просто не знал будет ли это быстрее.
14 фев 20, 07:52    [22079717]     Ответить | Цитировать Сообщить модератору
 Re: Дилетантский вопрос для повышения самообразованности  [new]
Nick-name
Member

Откуда:
Сообщений: 667
Akina,

А как выдумаете, по поводу вот такого алгоритма

1. парсер пишет в фаил.
2. процедура из файла пишет в свою таблицу
3. Другая процедура из специальной таблицы перетаскивает в общую

Как мне видится, таким образом решается вопрос, и уникальности записей в конечной таблице и с сервера нагрузка снимается, так как первая и вторая процедуры имеют зазор во времени.
14 фев 20, 08:16    [22079722]     Ответить | Цитировать Сообщить модератору
 Re: Дилетантский вопрос для повышения самообразованности  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20009
По-моему, я именно это и предлагал... что же касается начала, уж лучше пусть парсеры пишут прямо в таблицы. Так хотя бы немного снизится максимальная загрузка сервера - работа по пополнению RAW таблиц будет "растянута" по времени. А ещё не получится такой бяки, что парсер пытается писать в файл, который в этот момент пытается читать сервер.

Хотя с другой стороны накладные расходы возрастут... в общем, тестить надо.
14 фев 20, 14:14    [22080025]     Ответить | Цитировать Сообщить модератору
 Re: Дилетантский вопрос для повышения самообразованности  [new]
Alex_Ustinov
Member

Откуда: Nickel
Сообщений: 2955
Nick-name
Например есть пять приложений, допустим парсеры, или, что-то подобное, то что должно делать много инсертов.
С точки зрения базы как лучше


сложно представить масштабы....)))
При нынешних процессорах и памяти при инсертах весь тормоз будет в транспортировке данных по железу и записи на диск самих данных и индексов. Так что "БАЗЕ" это конгруэнтно, что 5 приложений что 15. Обычно упирается в диски.
Писать таким приложениям надо на Отдельные физические диски как минимум, плюс SSD . плюс рейд.
Далее если используем InnoDB
стартовать c опцией innodb_file_per_table обязательно, этим избавимся от "общего" индексного файла
Но в настройках MySQL нет опций указать физическое размещение таблиц. Они всегда создаются в каталоге ДатаДир
1. Вариант сим-линками таблицы разносить по дискам. Но это муторно, там еще индексные файлы симлинкать.
2. Проще в Экземпляре MySQL c опцией innodb_file_per_table под каждое приложение создать свою "базу" (это всего лишь каталог в DataDir) и и симлинкать каталог
3. логичный путь если памяти навалом - под каждое приложение - свой инстанс, с указанием разных DataDir на разных дисках.
Обычно люди не занимаются ерундой которую я написал выше, собирают быстрый RAID массив.
Но вариант 2. документирован
15 фев 20, 23:58    [22080616]     Ответить | Цитировать Сообщить модератору
 Re: Дилетантский вопрос для повышения самообразованности  [new]
miksoft
Member

Откуда:
Сообщений: 37995
Alex_Ustinov
Но в настройках MySQL нет опций указать физическое размещение таблиц.
Не так чтобы совсем нет...
https://dev.mysql.com/doc/refman/8.0/en/innodb-create-table-external.html
16 фев 20, 18:50    [22080799]     Ответить | Цитировать Сообщить модератору
 Re: Дилетантский вопрос для повышения самообразованности  [new]
Alex_Ustinov
Member

Откуда: Nickel
Сообщений: 2955
miksoft,

ну тогда вообще проблем никаких.
я много пропустил)
16 фев 20, 20:25    [22080829]     Ответить | Цитировать Сообщить модератору
 Re: Дилетантский вопрос для повышения самообразованности  [new]
Alex_Ustinov
Member

Откуда: Nickel
Сообщений: 2955
ооо...
там уже тейбл спейсы можно делать типа
СREATE TABLESPACE `ts1` ADD DATAFILE '/my/tablespace/directory/ts1.ibd';
CREATE TABLE t1 (c1 INT PRIMARY KEY) TABLESPACE ts1;
ALTER TABLE t2 TABLESPACE ts1;

что-то по ненадобности все пропустил

Сообщение было отредактировано: 16 фев 20, 20:49
16 фев 20, 20:46    [22080836]     Ответить | Цитировать Сообщить модератору
Все форумы / MySQL Ответить