MySQL INSERT на большой стол - могу ли я улучшить быстродействие? - PullRequest
0 голосов
/ 07 сентября 2010

У меня есть таблица MyISAM с 2 полями f1 и f2, оба являются целыми числами без знака и не могут быть нулевыми.Таблица намеренно не имеет первичного ключа, но имеет индекс на f2.В настоящее время таблица содержит 320 миллионов строк.

Я хотел бы иметь возможность вставлять новые строки (около 4000 раз в неделю) в эту таблицу с приличной скоростью.Однако в настоящее время я вставляю около 4000 строк за 2 минуты.(Я делаю это, используя текстовый файл и команду «source» - текстовый файл содержит только операторы INSERT в эту таблицу).Есть ли способ ускорить вставку операторов?Кроме того, при выполнении операторов INSERT будут ли затронуты или замедлены какие-либо операторы SELECT / JOIN для той же таблицы?

Ответы [ 4 ]

3 голосов
/ 07 сентября 2010

Вы можете объединить операторы вставки из

INSERT INTO table (f1, f2) VALUES ($f1, $f2);
INSERT INTO table (f1, f2) VALUES ($other, $other);
etc...

в

INSERT INTO table (f1, f2) VALUES ($f1, $f2), ($other, $other), etc...

, что несколько снизит затраты на анализ.Это может немного ускорить процесс.Однако не стоит слишком углубляться в группировку вставок, поскольку для запроса задан параметр max_allowed_packet.

4000 строк за 2 минуты - это все еще 33 строки в секунду.Это не так уж плохо, особенно на огромной таблице, где необходимо обновить индекс.Вы можете отключить ключи в таблице перед выполнением вставки, а затем заново собрать ключ с помощью REPAIR TABLE, но это может занять больше времени, особенно при сканировании 320 миллионов строк.Вам нужно будет сделать несколько тестов, чтобы понять, стоит ли это делать.

Что касается SELECTS / JOINS, так как вы находитесь на таблицах MYISAM, то нет способа скрыть новые таблицы в транзакции, пока они всесделанный.Каждая строка сразу же будет видна другому сеансу при ее вводе, если только вы не заблокируете таблицу, чтобы получить эксклюзивный доступ к ней для вставок.Но тогда вы заблокировали всех остальных во время работы вставки.

0 голосов
/ 07 сентября 2010

@ RJK правильно. LOAD DATA INFILE - самый быстрый способ получить данные в вашу таблицу. Несколько других мыслей.

2 минуты кажутся мне длинными для 4k строк. SELECTs блокируют INSERT в MyISAM и, вероятно, замедляют вставки. Я настоятельно рекомендую InnoDB, у которого нет этой проблемы, плюс лучшее восстановление после сбоя и т. Д. Если вам нужно использовать MyISAM, может помочь блокировка таблицы перед запуском вставок или вы можете попробовать INSERT DELAYED, что позволит операторам INSERT немедленно возвращаться и обрабатывается, когда таблица свободна.

0 голосов
/ 07 сентября 2010

Если база данных может получить доступ к загружаемым данным, вы можете использовать команду LOAD DATA INFILE . Как описано в руководстве:

Оператор LOAD DATA INFILE читает строки из текстового файла в таблицу в очень высокая скорость.

Надеюсь, это поможет.

0 голосов
/ 07 сентября 2010

Насколько я знаю, source -команда - самый быстрый способ сделать это. Поскольку таблица - MyISAM, вся таблица блокируется во время действий записи. Так что да, все SELECT -выставления ставятся в очередь, пока все вставки / обновления / удаления не завершатся.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...