작업 중에 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
'프로그램 > mysql' 카테고리의 다른 글
You can't specify target table 테이블이름 for update in FROM clause (0) | 2017.11.17 |
---|---|
mysql 다시 깔기. (0) | 2014.03.15 |
mysql 에서 새 계정을 추가했는데, 접속이 안 될 때. (0) | 2014.02.17 |
mysql port 번호 바꾸기 Cafe24버전. (2) | 2013.09.13 |
Linux 에서 C 컴파일용 mysql library + header file 구하기. (0) | 2013.08.05 |