안녕하세요..언제나 많은 도움이 되고 있습니다. 감사합니다.
항상 오라클 게시판만 왔다갔다 하다 여기 mysql게시판에는 처음으로 질문 올리네요..
오라클을 제공해주는 호스팅을 써오다 사용자가 급증하여 제공업체에서 제 계정 하나때문에 cpu부하가 엄청 심해서 조치하지 않으면 서비스를 막는다고 하여
단독으로 서버호스팅을 하고 그 서버에 mysql community server 설치하였습니다.
DB서버로만 활용합니다.
서버 스펙은
CPU : Intel Xeon Quad-Core E3-1230 (Sandybridge)(3.20GHz / L3 8MB / 5.0GT/s)
RAM : DDR3 4G 10600 U-ECC
HDD : SATA2 500GB (7200.ES/기업용)
BAY2 : BAY / 1U (4.5cm)
회선 : 1Gbps 광(光) Dedicated Line
이구요...
현재 innodb로 설정한 상태이구요 설정값은
innodb_additional_mem_pool_size = 16M
innodb_buffer_pool_size = 2G
innodb_data_file_path=ibdata1:10M:autoextend:max:10000M
innodb_data_home_dir = /home/mysql/var
innodb_file_io_threads = 4
innodb_thread_concurrency = 8
innodb_flush_log_at_trx_commit = 1
innodb_log_buffer_size = 8M
innodb_max_dirty_pages_pct = 90
innodb_lock_wait_timeout = 120
입니다.
설치후 오라클에서 mysql로 마이그레이션 하고 mysql에 맞게 sql문을 수정하고 있는데요..
이전 호스팅에서 cpu 부하의 원인이 되던 sql문을 mysql 문법으로 바꾸고 실행을 했더니 1분이 넘게 걸리더군요..-_-;;
여차여차 하여 1~2초까지 줄였는데요..문제는 순간 cpu가 30%가 오릅니다.
이정도 자원을 잡아먹으면 3명만 동시에 쿼리를 날려도 답이 없어 보이는데요...
혹시 mysql community server 버전이 오라클로 말하면 XE버전 같은건가요?? 단순히 학습용으로 쓰이는..그런 버전..
mysql에 대해서 잘 몰라 그래요..ㅜㅜ
혹시 상용으로 따로 있는지요??
쿼리도 올립니다.
SELECT T1.EMAIL, T1.NICK_NAME, T1.BIRTH_DATE, T1.JENDER,
T1.INTRODUCE, T1.INTEREST_SCORE, T1.DISTANCE_NUM,
(SELECT CONCAT(FILE_URL_PATH,FILE_NAME_THUMB)
FROM MT_MEMBER_FILE
WHERE MEMBER_EMAIL=T2.MEMBER_EMAIL AND FILE_INDEX=T2.FILE_INDEX) URL
FROM (
SELECT A.EMAIL, A.NICK_NAME, A.BIRTH_DATE, A.JENDER,
A.INTRODUCE, IFNULL(A.INTEREST_SCORE, 0) AS INTEREST_SCORE,
ROUND( 6371 * ACOS( COS( RADIANS(37.62709565) ) * COS( RADIANS( A.LATITUDE ) ) *
COS( RADIANS( A.LONGITUDE ) - RADIANS(127.0335156) ) + SIN( RADIANS(37.62709565) ) *
SIN( RADIANS( A.LATITUDE ) ) ), 1) AS DISTANCE_NUM
FROM MT_MEMBER A, MT_CONNECT_LOG B
WHERE A.EMAIL = B.EMAIL
AND B.CONNECT_DATE > DATE_ADD(NOW(), INTERVAL-10 DAY)
AND A.LATITUDE IS NOT NULL
AND A.BIRTH_DATE BETWEEN '19120101' AND '20111231'
AND A.REPORT_COUNT < 4
AND A.JENDER = 'M'
AND A.EMAIL <> 'abc@abc.kr'
AND A.EMAIL <> 'abc@naver.com'
AND A.EMAIL NOT IN (SELECT EMAIL FROM MT_C2DM_KEY_NOT_REGI C)
AND A.EMAIL NOT IN (SELECT BLOCK_EMAIL FROM MT_BLOCK_MEMBER D WHERE EMAIL = 'abc@abc.kr')
AND A.EMAIL NOT IN (SELECT EMAIL FROM MT_BLOCK_MEMBER E WHERE BLOCK_EMAIL = 'abc@abc.kr')
AND DISTANCE_NUM > 100
AND DISTANCE_NUM < 99999
ORDER BY DISTANCE_NUM
LIMIT 1,50
) T1
LEFT JOIN
(SELECT MEMBER_EMAIL, MIN(FILE_INDEX) FILE_INDEX
FROM MT_MEMBER_FILE
GROUP BY MEMBER_EMAIL) T2 ON T1.EMAIL = T2.MEMBER_EMAIL ;
MT_MEMBER -> 73530 row
MT_MEMBER_FILE -> 94479 row
MT_CONNECT_LOG -> 69155 row
이구요..
explain 결과가
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY <derived3> ALL \N \N \N \N 50
1 PRIMARY <derived7> ALL \N \N \N \N 43753
7 DERIVED MT_MEMBER_FILE index \N PRIMARY 306 \N 113957 Using index; Using temporary; Using filesort
3 DERIVED A ALL PRIMARY,idx1_mt_member,idx2_mt_member \N \N \N 84272 Using filesort
3 DERIVED B eq_ref PRIMARY,idx_connect_date PRIMARY 302 comalong.A.email 1 Using where
6 DEPENDENT SUBQUERY E unique_subquery PRIMARY PRIMARY 604 func 1 Using index; Using where
5 DEPENDENT SUBQUERY D eq_ref PRIMARY PRIMARY 604 func 1 Using where; Using index
4 DEPENDENT SUBQUERY C unique_subquery PRIMARY PRIMARY 302 func 1 Using index
2 DEPENDENT SUBQUERY MT_MEMBER_FILE eq_ref PRIMARY PRIMARY 306 T2.FILE_INDEX,T2.MEMBER_EMAIL 1
이렇게 나왔습니다. 쿼리 자체의 문제로 cpu자원이 많이 쓰이는걸까요???
ps. MySQL GUI Tools 정말 좋군요..마이그레이션을 무지 걱정했는데 이 툴로 자동으로 금방 되네요...완전 강추입니다. ㅎㅎ
|