대용량 데이터 세트를 MySQL 데이터베이스 (또는 일반적으로 모든 데이터베이스)에 삽입하는 가장 좋은 방법은 무엇입니까


9

PHP 프로젝트의 일환으로 MySQL 데이터베이스에 행을 삽입해야합니다. 분명히이 작업을 수행하는 데 익숙하지만 한 쿼리에서 90 열에 삽입해야했습니다. 결과 쿼리는 끔찍하고 모 놀리 식으로 보입니다 (특히 PHP 변수를 값으로 삽입).

INSERT INTO mytable (column1, colum2, ..., column90) 
VALUES
('value1', 'value2', ..., 'value90')

올바른 방법으로이 문제를 해결하지 않을까 걱정됩니다. 또한 모든 것을 입력하는 데 오랜 시간이 걸리고 테스트 코드 작성 테스트도 지루할 것입니다.

전문가가 이러한 쿼리를 빠르게 작성하고 테스트하는 방법은 무엇입니까? 프로세스 속도를 높일 수있는 방법이 있습니까?


2
테이블에 열 이름을 입력하는 데 걸리는 사소한 시간보다 열이 90 개 더 걱정됩니다. (? BTW I 드래그 앤 SQL 서버에서 한 번에 모든 열을 드롭, 나는 더 오타가 없기 때문에 쉽게 생활을하게 찾을 수 있는지보고 싶은데이 MySQL을 또는 PHP에서 동일한 작업을 수행 할 수 aplace하지 않습니다.)
HLGEM

1
나는 90 개의 열이 많음을 알고 있지만 각 열은 채워야 할 pdf 문서의 단일 필드와 관련이 있으며 그것을 분류하는 요점이나 그 방법을 알 수 없습니다. SQL Server에 대한 정보를 주셔서 감사합니다. 열을 드래그 앤 드롭하는 것에 대해 당신이 무엇을 의미하는지 잘 모르겠습니다.
Joe

1
주어진 테이블의 모든 열을 나열하는 select 문을 작성하고 거기에서 이동하십시오.
JeffO

Jeff O : 저도 이것을 사용했습니다. 올바르게 수행하면 매우 강력한 기술이 될 수 있습니다. 코드 예제를 제공 할 수 있다면 답변으로 게시해야합니다!
FrustratedWithFormsDesigner

답변:


7

조, 당신의 마지막 의견은 많이 설명했습니다. 실제 문제는 데이터 디자인이라고 생각합니다. 문서 형식이 변경 될 때 새 열이 필요할 수 있으며 내 경험상 문서 형식이 자주 변경되는 경향이 있습니다. 보고서 당 단일 행이있는 90 열 테이블 대신 보고서 데이터를 report_id, format_id, field_name, field_value의 4 개 열이있는 테이블에 저장합니다. 각 보고서는 보고서의 각 필드 값에 대해 하나씩 90 개의 행으로 표시됩니다. 이렇게하면 코드가 상당히 단순 해집니다.


답장을 보내 주셔서 감사합니다. 모든 필드 (인덱스 제외)는 VARCHARS이므로 저에게 효과적입니다 (어쨌든 다른 값을 변환 할 수 있습니다). field_value 열의 크기를 가장 큰 값 (약 256 자 길이)으로 설정해야하기 때문에 많은 공간을 낭비 할 수 있지만 일부 필드는 길이 3 만 필요합니다. 그리고 당신이 묘사 한 것처럼 그것이 미래의 증거가 될 방법을 이해할 수 있습니다.
Joe

4
그러나 대부분의 데이터베이스 시스템은 데이터를 저장하는 데 필요한만큼의 공간 만 사용합니다. 따라서 VARCHAR (256) 필드에 3 자만 저장하면 256이 아닌 3 바이트 만 소요됩니다. MySQL 내부에 대해서는 잘 모르지만 필드를 완전히 채우면 놀랄 것입니다. 선언 된 크기.
TMN

@TMN VARCHAR의 VAR이 의미하는 바입니다! 가변 길이 Char. 이것은 DB 시스템이 아닌 데이터 유형의 함수 (또는 정의)입니다. 또한 VARCHAR은 가변 길이이므로 DB는 각 값의 길이를 알아야하므로 길이를 메타 데이터로 저장합니다. 이는 오버 헤드 스토리지를 의미합니다! 따라서 VARCHAR (1)은 실제로 Char (1)의 3 배인 오버 헤드로 인해 3 바이트의 데이터를 사용합니다!
Morons

2
-1, 나는이 대답에 동의하지 않습니다.이 경우 90 열로 더 좋습니다. 엔티티에 90 개의 데이터 포인트가있는 경우 데이터 포인트를 합리적으로 유지하십시오.
Morons

@TMN은 제 요점을 명확히하기 위해 "VARCHAR (256) 필드에 3 자만 저장하면 3 바이트 만 소요될 것"이라고 말했습니다. 사실은 3이 아닌 5 바이트를 차지합니다.
Morons

7

일반적으로 대용량 데이터 세트를 SQL 데이터베이스에로드하는 가장 빠른 방법은 기본 벌크로드 인터페이스를 사용하는 것입니다. 내가 아는 한, 모든 SQL dbms에는 적어도 하나가 있습니다.

MySQL 문서 : 벌크 로더 사용

나는 경우 SQL INSERT 문으로 탭 - 또는 쉼표로 구분 된 파일을 설정하는, 내가 입력 파일을 읽고 출력 파일을 작성 AWK를 사용합니다. awk에는 특별한 것이 없습니다. 내가 가장 잘 알고있는 텍스트 처리 언어 일뿐입니다. Perl, Python, Ruby, Rexx, Lisp 등의 코드를 작성하여 동일한 결과를 얻을 수 있습니다.


2
대량로드는 실제로 많은 수의 행을 삽입 해야하는 경우 갈 수있는 방법이지만이 경우 그는 많은 열이있는 단일 행을 삽입하는 것입니다. 대량로드는 도움이되지 않으며 간단한 접근 방식보다 더 많은 코드를 작성해야합니다.
TMN

-1,이 답변은 질문의 요점을 완전히 누락했습니다
Doc Brown

2

열 이름을 Excel 스프레드 시트로 쉽게 가져올 수 있으면 Excel 매크로를 작성하여 다양한 쿼리 및 DML 문에 대한 코드를 생성 한 다음 다른 열에 값을 붙여 넣기 만하면 삽입 / 업데이트 문이 자동으로 만들어집니다. 수동 입력은 속도가 매우 느린 방법이므로 기존 도구를 사용하여 트릭을 찾을 수 있는지 확인하십시오. 많은 개발자 중심의 텍스트 편집기는 매크로를 기록하고 저장하여 이와 같은 반복적 인 작업을 훨씬 빠르고 쉽게 수행 할 수 있습니다.


2

csv 파일이 있으면 LOAD DATA INFILE ... 을 사용하여 데이터 를 가져올 수 있습니다.

'INSERT'쿼리를 사용해야하는 경우 대량 삽입을 수행하면 프로세스 속도가 빨라집니다. 모든 단일 행에 대해 'INSERT'쿼리를 실행하는 대신 행을 그룹화하고 (100), 쿼리를 실행하십시오. 이 같은:

INSERT INTO theTable (col1, col2, col3,....., col89, col90) 
VALUES
(val11, val12, val13, ........, val189, val190),
(val21, val22, val23, ........, val289, val290),
.......
......
(val101, val102, val103, ........, va1089, val1090);

2

다중 열 쿼리 데이터를 MySQL DB에 작성하는 효율적인 방법은 이러한 데이터를 JSON 또는 YAML 형식으로 변환하여 단일 단위로 삽입하는 것입니다. "90 개의 열이있는 테이블에 대한 삽입 작성"을 "1 개의 열이있는 테이블에 삽입 작성"으로 변경합니다.

이 방법에서는 모든 것을 기본 컴포넌트로 세분화 할 필요는 없으며 단일 데이텀은 1 열로만 저장됩니다.


@ gnat : 대체 솔루션을 제공합니다. "90 개의 열이있는 테이블에 대한 삽입 작성"을 "1 개의 열이있는 테이블에 삽입 작성"으로 변경합니다. 설명 된대로 문제가 발생하면 유효한 솔루션입니다. 모든 것이 기본 구성 요소로 나눌 필요는 없습니다. 유일하게 비슷한 대답은 SQL 데이터베이스를 완전히 제거하여 완전한 NoSQL을 제안했습니다. 이 답변은 혼합 접근법을 사용할 수 있다고 말합니다. 이 단일 데이텀에 대해 단 하나의 열만 만드십시오. 대안은 이진 열이 있고 전체 pdf를 저장하는 것일 수 있습니다.
jmoreno

@gnat : Noviff에게 자신의 말로 표현할 기회를
주겠다

@ gnat 및 jmoreno-귀하의 의견에 감사드립니다. 나는 gnat의 대답에 대한 설명을 좋아하며 그의 설명에 따라 대답을 편집했습니다.
Noviff

0

MySQL을 사용하면 insert명령문에 대체 구문을 사용할 수 있습니다 .

insert into table
        set column1 = value1
          , column2 = value2
          , column3 = value3

1
이것이 실제로 더 빠릅니까?
Pacerier

@Pacerier 아니오, 이것은 빠르지 않습니다. 또 다른 구문.
Kaspars Foigts

0

속성 목록은 형식이 변경 될 때마다 변경 될 수 있으므로 시나리오는 NoSQL 솔루션에 매우 적합합니다. MySQL 이외의 다른 옵션을 평가 했습니까? DynamoDB / MongoDB / Cassandra를 파헤쳐보십시오.


-1

php와 mysql을 사용하여 데이터베이스에 데이터를 삽입하는보다 효율적인 방법이 있습니다. LOAD COMMAND를 사용하여 데이터를 삽입 할 수 있습니다. 데이터를 매우 빠르게 삽입합니다.

이를 위해 fputcsv()함수를 사용하여 데이터가 포함 된 플랫 파일 (예 : .csv 파일 사용)을 만듭니다. 그런 다음 LOAD 명령을 사용하여 데이터를 삽입하십시오. 다음과 비슷한 구문이 있습니다.

LOAD DATA LOCAL INFILE "C:/downloads/local/my_data_file.csv"
INTO TABLE  my_data
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES;

-1

다음을 시도하십시오. 나를 위해 일했다.

양식 이름은 데이터베이스 열 이름과 같아야합니다.

아래와 같이 값을 얻으십시오.

foreach ($_GET as $formName => $value) {
    $sql = mysql_query("UPDATE table_name SET $formName = '$value' WHERE ID= $id");
}

먼저 foreach 루프 전에 ID를 삽입해야합니다. 다음을 수행하여 다음 ID를 얻을 수 있습니다.

SELECT MAX(id) FROM .....

id에 1을 추가하고 삽입하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.