MariaDB 가 형에 민감하군요,, 제작이야기 | Posted on 2018. 9. 12. 23:31
음..
오늘 갑자기 사이트 반응속도가 느리길래..
뭐가 문젠가 싶어서 들여다 보는데..
top 으로 명령어를 때려보니, 스왑까지 풀로 쓰면서(..) CPU와 RAM 을 100% 쓰더군요..
(언젠가 보던 현상인데..)
그래서 서버단에서 할 수 있는 생각할 수 있는건 다 해봤는데도, 좋아지지 않고, 사용율이 떨어질 생각을 안하길래..
top 명령어 사용율을 자세히 보니, mysqld 가 60 ~ 80%를 왔다갔다.. (..)
mariadb 가 뭔가 문제가 터졌구나.. 하면서 역시나 서버 설정을 만지작 만지작..
(왜냐면 지금까지 잘 됬으니까..)
설정을 만지작 거려도 상황이 안좋아지길래, CPU와 RAM을 증설해야하나! 라고 생각하면서 카드를 만지작 만지작 하던 찰라..
혹시 몰라서 슬로쿼리를 살펴봤습니다.
SHOW PROCESSLIST;
위의 명령어를 치고나니, 나오는 엄청난 양의 슬로우 쿼리.. (.. .. ..)
한번 실행에 1분 ~ 3분씩 걸리고 있더군요;;
슬로쿼리의 명령문을 살펴보니..
UPDATE `ci_blocks` SET `ci_blocks`.`ids` = '[]' WHERE `ci_blocks`.`id` = 933224862847397890;
참고로 id 필드는 VARCHAR(40).
explain 을 찍어봤습니다.
업데이트에 index 를 타지 않아!!!
그렇습니다.
index 를 타지 않아서 쿼리가 느렸던거..;;
(단순 SELECT 보다 느린 UPDATE..)
그래서 뭐가 문젠지 살펴보다가, "그리고 보니 varchar 인데 int 타입으로 해도 에러가 안나네?" 하면서 id 를 문자형으로 고쳐줬습니다.
EXPLAIN UPDATE `ci_blocks` SET `ci_blocks`.`ids` = '[]' WHERE `ci_blocks`.`id` = '933224862847397890';
문자형으로 고쳐주니 바로 index 를 타게 됩니다!
explain 을 떼고 쿼리를 실행해보니, 1 ~ 3분 걸리던 쿼리가 0.1초 만에 실행이 됩니다.
쌩으로 쿼리 날릴때는 신경써서 따옴표 붇이는데, CI의 Active Record 쓰면서는 딱히 신경 안썼더니, 저런 문제가 발생을 하네요;;
받을때 int 로 받고, 넘길때 (string) 을 해줘서 문자형으로 변형해야만 인덱스를 타다니.. (큿..)
숫자형을 문자형으로 변경만 하고서 지켜보는데, 점유율이 확 떨어지네요.
mysqld 점유율이 5 ~ 10% 왔다갔다 하는거 보면..
ps. 사실 모 사이트 로딩속도가 느려서 한번 봐야지.. 생각만 하고 있었는데..
이렇게 터지네요.
음음..
지금 뒤에서 만들고 있는게 좀 있어서 기존 사이트 관심을 안줬더니, 이런문제가;;
ps2. 지금 안 사실인데, css 와 js 파일이 캐싱이 안되고 있었네요.
이건 또 왜 안되는지 살펴봐야,,