我要在一个文件夹中导入每个文件包含50,000行的文本文件,并带有批处理文件。批处理文件当前逐个导入每个文件,但随着时间的推移会降低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'"
答案 0 :(得分:1)
@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,因此方法可能相似。
如果以下情况,您可能会发现Transactions更快 您需要处理许多语句。
此代码将使用以下命令创建一个sql文件:
事务性BEGIN
和COMMIT
语句。
事务中的Sql语句将被处理
作为一个完整的批次。
这意味着数据库将锁定并打开一次,
执行sql语句的事务,
然后将解锁并关闭数据库。
如果未定义名为commit
的变量,
那么mysql.exe
将不会作为无sql语句运行
被回显到sql文件。
答案 1 :(得分:0)
让我们尝试一下。
@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
进程,而最终只会消耗所有的内存和CPU。
对于删除部分,您会注意到文件echo del /Q *.txt
末尾的代码行,这将纯粹echo
删除文件夹中所有txt
个文件的删除命令,仅在脚本完成整个运行之后,如果您100%确定要在文件完成后删除该文件,然后只需从该行中删除echo
,请注意,如果删除该文件,它将然后删除所有文件。