Массовый импорт текстовых файлов в MySQL с помощью командного файла - PullRequest
0 голосов
/ 18 апреля 2019

Я импортирую текстовые файлы по 50000 строк в папке с командным файлом.Пакетный файл в настоящее время импортирует каждый файл 1 на 1, но со временем замедляет LOT.Но если я закрою его и снова открою, он снова начнет быстро, а затем замедлится.Мне интересно, есть ли у кого-нибудь идеи сохранить скорость, чтобы я мог запускать ее, не проверяя ее часто.

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

FOR %%f IN (*.txt) DO "C:/Program Files/MySQL/MySQL Server 8.0/bin/mysql.exe" -u root --password=passhere -D databasename -e "LOAD DATA INFILE 'D:/Newfolder/dd/%%f' IGNORE INTO TABLE tablename FIELDS TERMINATED BY ':' LINES TERMINATED BY '\n'"

Ответы [ 2 ]

1 голос
/ 18 апреля 2019
@echo off
setlocal

set "sqlfile=loadData.sql"
set "folder=D:/Newfolder/dd"

(
    set "commit="
    echo BEGIN;

    for %%f in ("%folder%/*.txt") do (
        echo LOAD DATA INFILE '%folder%/%%~nxf' IGNORE INTO TABLE tablename FIELDS TERMINATED BY ':' LINES TERMINATED BY '\n';
        set "commit=defined"
    )

    echo COMMIT;
) > "%sqlfile%"

if defined commit (
    "C:/Program Files/MySQL/MySQL Server 8.0/bin/mysql.exe" -u root --password=passhere -D databasename < "%sqlfile%"
)

Мое знание синтаксиса MySQL мало, хотя я знаю SQLite, поэтому методы могут быть схожими.

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

Этот код создаст файл sql с операторами транзакций BEGIN и COMMIT.Операторы Sql в транзакции будут рассматриваться как полный пакет.Это означает, что база данных будет заблокирована и открыта один раз, выполнит транзакцию операторов SQL, а затем разблокирует и закроет базу данных.

Если переменная с именем commit не определена, то mysql.exe не будет работатьпоскольку никакие операторы SQL не были отражены в файл SQL.

0 голосов
/ 18 апреля 2019

Давайте попробуем.

@echo off
setlocal enabledelayedexpansion
set "_sqlcmd=C:\Program Files\MySQL\MySQL Server 8.0\bin\mysql.exe"
set cnt=1
for %%i in (*.txt) do (
     set id=%%i
     call :check
)

:check
for /f "tokens=1,*" %%a in ('tasklist ^| find /I /C "mysql"') do set procs=%%a
if !procs! leq 20 (
    if not "!id!"=="%0" "%_sqlcmd" -u root --password=passhere -D databasename -e "LOAD DATA INFILE 'D:\Newfolder\dd\!id!' IGNORE INTO TABLE tablename FIELDS TERMINATED BY ':' LINES TERMINATED BY '\n'"
    set /a cnt+=1
) else (
    goto check
)
echo del /Q *.txt

Будет запущено девять mysql процессов, если один (или более) закроется, он запустится больше, пока мы снова не достигнем 20 процессов.(Вы можете увеличить / уменьшить количество процессов, которое хотите разрешить.) Таким образом, вы не будете запускать слишком много mysql процессов одновременно, которые в конечном итоге просто потребляют всю память и ЦП.

Что касается удалениячасть, вы заметите строку кода в конце файла echo del /Q *.txt Это будет просто echo команда удаления всех txt файлов в папке, ТОЛЬКО после того, как скрипт завершил весь прогон, если вам 100% уверен, что вы хотите удалить файл после его завершения, а затем просто удалите echo из этой строки, просто помните, что если вы удалите его, он удалит все файлы.

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