묻고답하기
대용량 테이블(테이터베이스, db, table) 처리 어떻게 하시나요?
2015.10.05 14:16
오래 동안 사이트를 운영하다보니 특정 테이블의 사이즈가 커지면서 게시판의 글을 read 하거나 검색할 때 속도 지연이 발생합니다.
현재 xe_document의 테이블 크기는 1G가 조금 넘는 상태인데요, 단독 서버를 운영하다보니 mysql을 직접 컨트롤 할 수가 있어서 아래와 같이 my.cnf를 구성해서 사용하고 있습니다.
key_buffer_size=2048M
tmp_table_size=1024M
wait_timeout = 86400
max_allowed_packet = 1073741824
하지만 성능이 개선되었다는 느낌을 받을 수 없고, db connection, select 등의 응답 시간을 찍어서 비교를 해봐도 설정 전과 나을 바가 전혀 없는 것 같습니다.
대용량 테이블, 대용량 데이터베이스를 처리하기 위해서 어떤 식으로 mysql을 운영하는지 가이드를 받고 싶습니다.
xe 코어를 수정하는 것보다는 시스템이나 mysql의 설정 상에서 가능한 방법을 찾고 있습니다.
댓글 6
-
기진곰
2015.10.05 14:54
-
gonom
2015.10.05 15:14
기진곰님의 전문적인 답변에 감사합니다.
조금더 부연하자면 제 사이트는 delete, update 요건은 거의 없으며 99% 이상이 select 입니다.
이런 환경에서도 답변 주신 구성이 도움이 될수 있을지 궁금합니다.
또한 innodb로 변경 시 얼마 정도의 성능향상을 기대할 수 있을지도 궁금합니다.
이미 100여개의 도메인이 운영 중이라 dbms를 변경하는 게 그리 쉬운 작업이 아니라서 구체적으로 알아보려고 합니다.
-
기진곰
2015.10.05 15:21
글 한 번 조회하면 조회수가 올라가죠? 그게 다 update입니다 ㅠㅠ
동접수가 많은 상황에서 update가 빈번하게 일어난다면 InnoDB가 확실히 빠릅니다. MyISAM은 update를 할 때마다 테이블 전체에 lock을 걸어버리지만, InnoDB는 실제 영향을 받는 레코드만 lock을 걸어놓고 작업하거든요. select 성능에는 큰 차이가 없지만, 데이터까지 버퍼링하는 덕을 조금 볼 수도 있고요.
물론 가장 큰 변수는 서버 자체의 디스크 성능이고 (SSD >> 넘사벽 >> HDD) 그 밖에도 여러가지 변수가 있기 때문에 딱 잘라서 말하기는 힘듭니다. DB단에서는 비교적 최근 (5.5 이상) 버전의 MySQL 또는 MariaDB에 InnoDB를 사용하고 버퍼를 넉넉히 주는 것으로 대개 마무리되지만, 실제로 XE로 만든 사이트의 성능을 최적화하려면 오브젝트 캐시 적용, 자주 쓰는 위젯 캐싱 등 여러가지 조치를 병행하게 됩니다.
-
gonom
2015.11.02 03:22
저에게는 좀 어려운 내용입니다.
기본 my.cnf를 huge.cnf로 변경한 후에 응답속도가 훨씬 개선된 것을 확인하였는데요, 솔직히 그 안에 내용도 정확하게 이해를 하지 못한 상황입니다.
대용량 table에 최적화 된 cnf 파일을 받아볼 수 있을까요?
실제 서비스에 적용을 해보고 차이를 비교해보려고 합니다.
-
기진곰
2015.11.02 09:26
대용량 테이블에 최적화된 cnf 파일이라는 것은 없습니다. 님의 정확한 서버사양과 테이블 용량 및 구조, 이용패턴에 따라 다양한 방법의 최적화를 시도해 볼 수 있을 뿐이죠.
huge.cnf를 적용하여 성능이 개선되었다면 그대로 사용하셔도 되고요... 그러나 기본으로 제공되는 설정파일들은 대부분 10여년 전의 일반적인 서버사양을 기준으로 작성된 거라 요즘 사용하기에는 부족한 점이 많아요. 게다가 요즘은 거의 InnoDB 중심으로 설정하는 추세라, 여전히 MyISAM을 사용하고 계시다면 한계가 있습니다. 이건 cnf 파일만 바꾼다고 되는 게 아니기 때문에...
-
gonom
2015.11.02 10:55
dbms를 더 이해한 후에 내 시스템에 적합한 파라미터 값을 찾아봐야 할 것 같으네요. 전문적인 답변에 감사합니다.
모든 테이블의 저장엔진을 InnoDB로 바꾸고, innodb_buffer_pool_size 설정을 넉넉하게 줍니다. MyISAM에서 사용하는 key_buffer_size는 데이터는 버퍼링하지 않고 인덱스만 버퍼링하기 때문에 테이블 용량이 커질수록 효율이 떨어집니다. 만약 이미 InnoDB를 사용하고 계시다면 key_buffer_size를 아무리 바꿔봤자 아무 효과가 없고요...
단독서버에서 1GB짜리 테이블은 대용량 축에도 들지 못합니다. 단, XE의 검색 기능은 성능이 최악인 LIKE %% 쿼리를 사용하기 때문에 데이터가 조금만 쌓여도 속도가 느려지는 것은 어쩔 수 없습니다. 큰 사이트에서는 대부분 검색 기능을 떼버리고 구글 검색창을 갖다 붙이더군요.