프로그램/mysql

Mysql 에서, 한 번의 query 로 실행할 수 있는 query 문장의 길이는 얼마까지?

(주)CKBcorp., 2014. 8. 10. 05:30
반응형



작업 중에 Insert 할 일이 있었는데, 이게 좀 까다로워서... 응답성을 많이 신경써야 하는 요구사항이었다.


데이터는 대략 초당 2000 row 정도 날라오는데( 계속 갱신 ), 이걸 사용자에게 최대한 끊김없이 보여주어야 하는 것.

물론 지금의 computer power 라면 저 정도야 문제 없지만, 

서비스의 특성상 나이스 타이밍으로 절묘한 특정 순간에 data request 를 하게 되면, 유실된 데이터 혹은 불명확한 데이터를 볼 수 있는 것.


응답성을 생각하면 데이터를 날리지 않고 무조건 update 하는 게 맞지만, 그러자니 update가 너무 빈번해서( 저렴한 서버라 어쩔 수 없다. )

토의 결과 날라오는 데이터를 


1. 무조건 search -> update 하지 않고, 

2. 일정 시간만큼 모아놨다가, 

3. insert 로 한 방에 갱신하기로 ( update 대신 truncate -> insert ) 


했다. 근데, 그러려니 최대한 짧은 시간에 insert 가 완료될 필요가 있어서,


쿼리문을 다중 insert 문 (정확한 용어를 모르겠네.   INSERT INTO 테이블명 ( 필드이름들 ... ) values ( ... ), ( ... ), ( ... ), ( ... ), ( ... ), ( ... ), ( ... ), ( ... ),  요런거. ) 으로 주욱 늘어뜨린 다음 한방에 들어가게 만들었다.


그럼, 쿼리문 하나가 엄청 길어지잖아?


그래서 찾아봤지. "쿼리문 한 번에 요청 가능한 sql 문장의 최대 길이는? "


답 : 결론부터 말하면, mysql 의 경우 1Mbyte 이다. ( 1024byte * 1024byte ) .


설명을 좀 더 붙이면,


1. mysql 이냐 mssql 이냐 oracle 이냐... 쨌던 엔진에 따라 다르다. 정확하게는 엔진 설정값에 따라 다르다.

2. mysql 의 경우 max_allowed_packet 이란 설정값이 있는데, 이게 default 값이 1Mbyte 라는군.

3. 물론 사용자가 my.cnf 같은거 바꾸어 주면 더 늘어날 수 있다.

4. native program 으로 짤때는 DB 엔진의 max_allowed_packet 만 신경써주면 되는데, 만약 web 으로 접속하는 경우라면 조금 더 복잡.

예를 들어 html -> php -> mysql 의 경우는,

UI 단인 html 에서 넘겨받는 QUERY 문장이 post 냐 get 이냐 에 따라 원천적인 길이 제한이 있다. ( 대략 get 일경우 1024 byte, post 의 경우 4000byte 던가? 제한없던가? 기억 잘 안남 )

WEB SERVER 단인 PHP 로 넘어오면, php 자체( php.ini ) 에 max_allowed_packet 설정값이 따로 또 있다고 한다. 이건 기본값이 16Mbyte 라는데... 실제로 확인해 본 건 아님. 


4. C 코드로 시험해 보니, 256Kbyte 정도는 가볍게 실행한다.


참고 사이트는 아래와 같다.


http://stackoverflow.com/questions/3026134/is-there-a-limitation-to-the-length-of-the-query-in-mysql

http://www.comqna.net/bbs/board.php?bo_table=linux&wr_id=22




 


반응형