PHP запрос PDO, оптимизировать скорость работы более 10 миллионов строк базы данных MS ACCESS - PullRequest
0 голосов
/ 30 января 2020

Мне нужно импортировать базу данных MS Access в MySQL. Одна из таблиц насчитывает почти 10 миллионов записей. Я пытаюсь сделать нумерацию страниц 4000 каждый раз. Проблема в том, что запрос MS Access длится более 35 секунд (35 секунд при разбивке на 4000 строк - около 24 часов ...).

Это код для подключения MS Access:

$dataSourceName = "odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)}; DBQ=".$this->dbPath."; Pwd=";
$this->connection = new PDO($dataSourceName, "", "");
$sql = "SELECT TOP $pageSize * FROM $table WHERE $table.$primaryField > $lastIndex ORDER BY $table.$primaryField";
$rs  = $this->connection->query($sql)->fetchAll(\PDO::FETCH_ASSOC);

$primaryField в Access - целое число (первичный ключ).

Как можно ускорить этот запрос? Я что-то не так делаю?

1 Ответ

0 голосов
/ 30 января 2020

Ваша задача обычно называется ETL для extract-transform-load.

У вас есть несколько способов ускорить это.

  • попробуйте большие партии строки (страницы). Возможно, что выборка 40K строк может быть намного быстрее для каждой строки, чем 4K строк с использованием вашего интерфейса ODB C.
  • Access имеет команду «Сжать и восстановить базу данных» в разделе «Инструменты» или «Управление» пользовательского интерфейса. Возможно, очистка ускорит ваши операции, особенно если база данных использовалась некоторое время. Подкрепите это сначала. Это занимает время простоя.
  • экспортируйте таблицу Access в файл .csv в вашей файловой системе, затем используйте LOAD DATA INFILE, чтобы импортировать ее в MySQL. Экспорт в .csv может быть значительно быстрее, чем ваши запросы odb c.
  • переписать вашу программу извлечения / переноса / загрузки в do tnet (C#). do tnet имеет собственный, а не ODB C, интерфейс для чтения файлов доступа и может быть намного быстрее.

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

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

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