Таблица 500к записей (InnoDB), простой запрос - 5 минут

Redjik

Джедай-мастер
Фанат
да ни коим образом, я делюсь решением, как это сделал я

Если все остановить на на этапе распиаршиваю, то выходит 500к запросов, на каждый товар + обработка через php, хотя php тут вообще не нужен
 

workOnFood

Новичок
workOnFood
блин у тебя одна таблица - текущие записи, вторая таблица - записи из xml... у тебя же есть id в xml
не вижу проблемы - единственное - запрос я пол дня писал этот, чтобы он быстро обрабатывался =)
Мне нужно чтобы все записи из xml были у меня в бд, тобишь актуальные данные. И вобщемто абсолютно фиолетово будет там published = 0 либо вовсе не будет записи. Нафига мне сложный запрос, чтобы потом сделать из двух таблиц одну правильную, если вторая уже правильная и остается удалить первую и переименовать вторую. Это фанат предложил несколько постов тому назад.
 

Фанат

oncle terrible
Команда форума
В общем, попробуй так.
при импорте создавай таблицу как myisam, а по окончании меняй движок на innodb (если это нужно).

или заключай ввсе инсерты в транзакцию.
будет в разы быстрее
 

workOnFood

Новичок

Фанат

oncle terrible
Команда форума
Короче, вся соль - в транзакциях.
причём даже наличие праймари ключа на скорость не влияет.

как оно с селектами - не знаю, но не думаю, что поможет.
 

confguru

ExAdmin
Команда форума
Во первых на винде работать с таким обьемом - анрил. Сколько памяти на машине? Свопит ли при выполнении запроса?
Во вторых укажи сколько занимает места на диске эта база.
 

workOnFood

Новичок
Во первых на винде работать с таким обьемом - анрил. Сколько памяти на машине? Свопит ли при выполнении запроса?
Во вторых укажи сколько занимает места на диске эта база.
На машине 4гб, но думаю вы имели ввиду сколько отдал под php, тогда 256мб. И да, делаю на винде, но это тестовый серв, боевой будет на линуксе. Что значит свопит? База занимает 971мб. - остальные таблицы оказались значительно меньше.
 

fixxxer

К.О.
Партнер клуба
В общем, попробуй так.
при импорте создавай таблицу как myisam, а по окончании меняй движок на innodb (если это нужно).

или заключай ввсе инсерты в транзакцию.
будет в разы быстрее
Не, просто транзакции недостаточно. Все же в мануале написано:
Код:
SET autocommit=0;
SET unique_checks=0;
SET foreign_key_checks=0;
INSERT ...
...............;
COMMIT;
SET foreign_key_checks=1;
SET unique_checks=1;
Добавлю, что может оказаться еще лучше грохнуть все индексы, кроме primary key, и потом заново создать. Плюс, если есть автоинкремент, изменить innodb_autoinc_lock_mode на 2.

С муисамом, даже если создавать все индексы потом, все равно будет медленнее - конвертация в innodb это примерно то же, что select-insert из myisam в innodb таблицу.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
добавлю по теме:
http://dev.mysql.com/doc/refman/5.5/en/innodb-parameters.html#sysvar_innodb_doublewrite

http://www.mysqlperformanceblog.com/2011/01/03/mysql-5-5-8-in-search-of-stability/
Doublewrite activity actually adds significant I/O activity. Basically, it doubles the amount of writes , as you see from its name.
в качестве простого теста, после выставления у себя в my.cnf
innodb_doublewrite = 0
при импорте дампа на 700 метров я вижу уменьшение загрузки винта с 36-50 Мб/сек до 11-25Mb/sec
у меня SSD, mysql в обоих случаях упирается в CPU
правда, это на винде, но разница именно в 2 раза налицо

опять вспоминаю Postgres, в котором все важные настройки документированы очень хорошо, там эта фича называется write-ahead log
в отличие от InnoDB, WAL в pg можно вынести на отдельный винт для записи параллельно с данными
 
Сверху