Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Веб-программирование > PHP / MySQL

PHP / MySQL Создание динамических Веб-ресурсов

Ответ
 
Опции темы
Старый 31.05.2015, 00:09   #1
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
[MySql] Медленный INSERT

В общем есть таблица с 7-ю миллионами записей. Необходимо быстро вставлять в нее десяток записей. Как это лучше сделать и влияет ли на это движок таблицы?

Сейчас у меня таблица innodb и вставляет записи за несколько секунд. Хотелось бы это как-то ускорить...
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 31.05.2015, 01:24   #2
Randomize
[object Object]
 
Аватар для Randomize
 
Регистрация: 01.08.2008
Адрес: В России
Сообщений: 4,354
Написано 2,470 полезных сообщений
(для 6,850 пользователей)
Ответ: [MySql] Медленный INSERT

Если есть доступ к my.ini смени эти параметры и рестартни:
innodb_buffer_pool_size = рам
innodb_read_io_threads = побольше потоков чтения
innodb_write_io_threads = побольше потоков записи
innodb_thread_concurrency = общее кол-во потоков
может имеет смысл врубить innodb_file_per_table

Попробуй сделать EXPAIN для такого INSERT запроса чтоб не ходить вокруг да около (ток мускуль 5.6)
http://dev.mysql.com/doc/refman/5.6/en/explain.html

Или профильнуть через SHOW PROFILES; после INSERT
__________________
Retry, Abort, Ignore? █
Intel Core i7-9700 4.70 Ghz; 64Gb; Nvidia RTX 3070
AMD Ryzen 7 3800X 4.3Ghz; 64Gb; Nvidia 1070Ti
AMD Ryzen 7 1700X 3.4Ghz; 8Gb; AMD RX 570
AMD Athlon II 2.6Ghz; 8Gb; Nvidia GTX 750 Ti
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
pax (31.05.2015)
Старый 31.05.2015, 11:23   #3
h1dd3n
Бывалый
 
Аватар для h1dd3n
 
Регистрация: 19.06.2008
Сообщений: 679
Написано 264 полезных сообщений
(для 450 пользователей)
Ответ: [MySql] Медленный INSERT

Еще вставлять надо в одной транзакции. И чем меньше индексов тем быстрее будет.
__________________
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
pax (31.05.2015)
Старый 31.05.2015, 15:07   #4
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: [MySql] Медленный INSERT

Спасибо, попробую!
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 31.05.2015, 15:12   #5
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: [MySql] Медленный INSERT

По настройкам стоит:

innodb_buffer_pool_size = 8388608000
innodb_read_io_threads = 4
innodb_write_io_threads = 4
innodb_thread_concurrency = 0
innodb_file_per_table = OFF
Что посоветуете при наличии процессора core i7 с восемью логическими ядрами?
MySql 5.5 установлен.
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 31.05.2015, 23:39   #6
Nikich
Бывалый
 
Регистрация: 22.12.2011
Сообщений: 844
Написано 150 полезных сообщений
(для 275 пользователей)
Ответ: [MySql] Медленный INSERT

Для ускорения записи еще innodb_log_file_size увеличить нужно.
Если все равно нет, то можно шардить по нескольким таблицам.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
pax (01.06.2015)
Старый 01.06.2015, 16:55   #7
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: [MySql] Медленный INSERT

В общем сменил настройки mysql, при задании innodb_log_file_size сервер не стартует, оставил значение по умолчанию. Не понятно в чем проблема, логи почему-то пустые постоянно.
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 01.06.2015, 17:25   #8
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: [MySql] Медленный INSERT

Судя по всему скорость инсерта записей ускорилась с нескольких секунд до десятков миллисекунд, спасибо всем за помощь!
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 01.06.2015, 17:29   #9
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: [MySql] Медленный INSERT

Если у тебя не реляционные данные там, то лучше использовать key,value хранилища, например Cassandra легко ставится, и справляется с одной огромной коллекцией на много лучше.
(Offline)
 
Ответить с цитированием
Старый 01.06.2015, 18:02   #10
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: [MySql] Медленный INSERT

реляционные, до key value пока не дорос наверное
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 01.06.2015, 18:55   #11
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: [MySql] Медленный INSERT

Сообщение от pax Посмотреть сообщение
реляционные, до key value пока не дорос наверное
Там проще обычно.

Если тебе нужно шустрый insert, но очень шустрый read не сильно критичен, то бери mongodb. Т.к. у него на много выше скорость insert'а, но ниже скорость read'а обычно.

Плюс как уже подметил, если тебе индексы нужны для анализа, и анализ можно делать offline, то лучше не индексуй основную таблицу, а лишь когда делать оффлайн анализ скриптом индексируй отдельную таблицу с семплом анализируемых данных.
(Offline)
 
Ответить с цитированием
Старый 01.06.2015, 19:38   #12
h1dd3n
Бывалый
 
Аватар для h1dd3n
 
Регистрация: 19.06.2008
Сообщений: 679
Написано 264 полезных сообщений
(для 450 пользователей)
Ответ: [MySql] Медленный INSERT

партицирование
__________________
(Offline)
 
Ответить с цитированием
Старый 02.06.2015, 13:21   #13
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: [MySql] Медленный INSERT

Сообщение от h1dd3n Посмотреть сообщение
партицирование
Это поможет только если партицировать по (id % partitions), но это очень ограничено и усложнит запросы к бд.

Следственно партицирование не решает write проблемы, и обычно используется при высокой read нагрузке и огромных объемах данных (100гб+).
(Offline)
 
Ответить с цитированием
Старый 02.06.2015, 13:51   #14
h1dd3n
Бывалый
 
Аватар для h1dd3n
 
Регистрация: 19.06.2008
Сообщений: 679
Написано 264 полезных сообщений
(для 450 пользователей)
Ответ: [MySql] Медленный INSERT

Сообщение от moka Посмотреть сообщение
Это поможет только если партицировать по (id % partitions), но это очень ограничено и усложнит запросы к бд.

Следственно партицирование не решает write проблемы, и обычно используется при высокой read нагрузке и огромных объемах данных (100гб+).
Что за бред. Я пониманию что тебе возможно трудно писать по-русски, но в твоем посте смысла просто 0...

Партицировать таблицу можно по дате (например, помесячно). При партицировании индекс становится тоже партицированным, что охренительно ускоряет insert. Если сейчас инсерт например 0.01, то при росте базы (это ведь таблица со статистикой, наверняка будет расти) время инсерта может сильно увеличиться и с этим уже ничего не поделаешь (только лишаться индексов или делить таблицу на несколько). А с партицированием будет обновляться только индекс соответствующей партиции (например, за месяц), что значит что даже через 10 лет инсерт будет примерно такой же как и сейчас (и при этом делить таблицу на несколько, или удалять из нее данные не надо)
__________________
(Offline)
 
Ответить с цитированием
Старый 02.06.2015, 13:59   #15
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: [MySql] Медленный INSERT

Сообщение от h1dd3n Посмотреть сообщение
Что за бред. Я пониманию что тебе возможно трудно писать по-русски, но в твоем посте смысла просто 0...

Партицировать таблицу можно по дате (например, помесячно). При партицировании индекс становится тоже партицированным, что охренительно ускоряет insert. Если сейчас инсерт например 0.01, то при росте базы (это ведь таблица со статистикой, наверняка будет расти) время инсерта может сильно увеличиться и с этим уже ничего не поделаешь (только лишаться индексов или делить таблицу на несколько). А с партицированием будет обновляться только индекс соответствующей партиции (например, за месяц), что значит что даже через 10 лет инсерт будет примерно такой же как и сейчас (и при этом делить таблицу на несколько, или удалять из нее данные не надо)
Основная проблема скорости insert'а в данном случае связана не с размером таблицы, а со сложностью индексации на таблице + количество insert'ов в секунду, и работа требуемая на обработку данных даже до того как вставится в таблицу. И лишь потом уже фактор большой таблицы.

Следственно если нафиг убрать индексы которые нужны только для обработки данных, это уже сильно ускоряет вставку.

Тем более хранить в бд устаревающие статистические данные - смысла нету вообще, как говорилось выше их нужно аггрегировать периодически, чтобы не нужно было хранить устаревшие и не нужные данные.
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 17:56.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com