2014-10-20 1 views
0

1 000 000 라인과 같은 것으로 mysql 데이터베이스에 테이블을 공급하려고합니다. 나는 루아와 기능을 사용하고 있습니다 :Lua 테이블에서 데이터베이스 (Mysql)에 데이터 삽입

CONN : " '(주문 (날짜, ordertype) 값으로 INSERT"(실행 ..tab를 [1] [dateIndex] ...

각 라인에 대해

문제는 길이가 너무 길어서 효율성이 더 필요하다는 것입니다. 다른 솔루션이 있습니까 (아마도 .csv를 만들고 mysql으로로드 할 수 있습니다. 데이터베이스를보다 효율적으로 ...) .Lua를 사용하는 것은 기존 프로젝트를 사용함에 따른 의무입니다.

도움을 주셔서 감사합니다.

답변

0

먼저 각 삽입에서 커밋을 중지 할 수 있습니다.

또한 준비된 쿼리를 사용할 수 있습니다. 그것은 Lua-DBI와 Lua-ODBC가 제공합니다. 저는 ODBC를 사용합니다.

local env = odbc.environment() 
lcoal db = env:driverconnect{ 
    Driver = IS_WINDOWS and '{MySQL ODBC 5.2 ANSI Driver}' or 'MySQL'; 
    db='test'; 
    uid='root'; 
}; 

cnn:set_autocommit(false) 
local stmt = db:prepare("INSERT INTO orders (dates, ordertype) VALUES(?,?)") 
for i, row in ipairs(tab) do 
    stmt:bindstr(row[dateIndex]) 
    ... 
    stmt:execute() 
    if i % 1000 == 0 then 
    cnn:commit() 
    end 
end 

또한 ODBC는 변수를 제공합니다. 매번 SQLBindParam을 호출하지 않기 때문에 더 빠를 수 있습니다.

-- create stmt as preview 
    ... 
    local dateValue = odbc.date():bind_param(stmt, 1) 
    local orderValue = odbc.ulong():bind_param(stmt, 2) 

    for i, row in ipairs(tab) do 
     dateValue:set(row[1]) -- data is yyyy-mm-dd e.g. 2014-10-14 
     orderValue:set(row[2]) 
     stmt:execute() 
     ... 
     -- same as preview