Как ускорить удаленное подключение к MySQL?

У меня есть приложение Java, которое анализирует файлы и сохраняет нужные мне данные в базе данных SQLite.

Я пытаюсь сохранить данные в удаленной базе данных MySQL, которая вместо этого находится на сервере моих хостов.

Я переписал запросы, которые имели другой синтаксис, но у меня все еще есть проблема: они выполняются намного медленнее, чем когда я делаю это локально, используя базу данных SQLite. Это что-то, с чем мне приходится смириться, так как одно локальное, а другое — удаленное соединение, или есть что-то, что я должен знать, прежде чем продолжить?

Например, разбор 636 файлов и сохранение всех нужных мне данных (некоторые данные бесполезны, часть нужно отсортировать и т. д.) занимает 2,5 минуты, когда я использую базу данных SQLite. Это примерно 4,24 файла в секунду. В среднем на файл уходит около 15 секунд, когда я использую базу данных MySQL, поэтому при использовании базы данных MySQL это займет примерно в 63 раза больше времени.

В чем, я думаю, может быть основная проблема, но я не знаю, как ее решить: в каждом файле в среднем 190 вставок. Поскольку файлы представляют собой листы статистики для боулинг-центра, и каждая игра представляет собой строку (60 игроков в лиге, умноженное на 3 игры), плюс некоторые проверки, чтобы увидеть, существует ли лига в таблице лиг, расписании и т. д., я действительно не могу просто делайте меньше вставок, так как вся информация важна.

Я думаю, было бы очень полезно, если бы я мог сгруппировать все вкладыши для игровой части в один большой вкладыш, но я понятия не имею, возможно ли это / как это возможно / стоит ли оно того или проблема в чем-то другом.

Я хотел бы знать, нахожусь ли я хотя бы на правильном пути или мне следует привыкнуть к моему приложению, которое занимает так много времени для хранения данных, поскольку оно подключено удаленно.


person Adam Smith    schedule 05.03.2012    source источник
comment
Да, у вас могут быть пакетные вставки, такие как INSERT INTO mytable (col1, col2) VALUES (1, 2), (3, 4), (5, 6). Что касается сжатия, прочитайте это - stackoverflow.com/questions/2506460/   -  person Roman Newaza    schedule 05.03.2012
comment
@RomanNewaza Проблема с этим в том, что у меня будет строка со 180 наборами значений в одной строке, что, я думаю, не такая уж большая проблема, но есть также тот факт, что есть предложение ON DUPLICATE KEY UPDATE в Если файл повторно загружается с новыми результатами, если в предыдущем была ошибка, я чувствую, что пакетная вставка затруднит управление. Думаю, стоит попробовать, спасибо!   -  person Adam Smith    schedule 05.03.2012
comment
Кстати, вы можете попробовать установить флаг сжатия через разъем БД.   -  person Roman Newaza    schedule 05.03.2012


Ответы (1)


Поскольку никто не ответил с ответом, и я нашел кое-что, что можно сделать для повышения производительности, я опубликую это здесь, чтобы люди могли использовать это в будущем, если, как и я, они не знали о пакетах.

Я использовал PreparedStatements (но обычные операторы работали бы так же), и вместо обычного ps.executeUpdate(); для выполнения моих запросов я использовал ps.addBatch(); между разными запросами, а затем ps.executeBatch();, когда я закончил построение запросов и хотел сделать один большой INSERT со всем в комплекте.

Обратите внимание, что при этом, если ваше соединение называется conn, вы должны сделать conn.setAutoCommit(false); перед запуском пакета и conn.commit(); после ps.executeBatch();. После этого вы можете снова установить для autoCommit значение true, если хотите.

person Adam Smith    schedule 15.03.2012