동일한 쿼리의 count와 data가 매우 느리게 작동합니다.
그래서 똑같은 쿼리를 DB에서 직접 수행하면 0.0초, 0.0초가 나옵니다.
홈페이지에서 해당페이지를 불러오면 디버그에 슬로우쿼리로 나오면서, 늦게 호출되는지 모르겠습니다.
아래는 디버그 캡쳐 입니다.
비슷한현상 또는 DB 튜닝에 대한 조언을 통해 해결 가능하시면 조언 구합니다.
PHP | PHP 7.4 |
---|---|
CMS | Rhymix 2.0 |
동일한 쿼리의 count와 data가 매우 느리게 작동합니다.
그래서 똑같은 쿼리를 DB에서 직접 수행하면 0.0초, 0.0초가 나옵니다.
홈페이지에서 해당페이지를 불러오면 디버그에 슬로우쿼리로 나오면서, 늦게 호출되는지 모르겠습니다.
아래는 디버그 캡쳐 입니다.
비슷한현상 또는 DB 튜닝에 대한 조언을 통해 해결 가능하시면 조언 구합니다.
라이믹스에서는 변수 자리에 ?를 넣어서 prepared statement로 쿼리하고, rx_ 접두사 때문에 조인할 때 alias 처리가 들어가기도 하는데... 직접 호출할 때는 그렇게 하지 않으실 테니 100% 똑같지는 않겠지요. 그러니까 어느 부분이 다른지 보고 싶다는 얘깁니다.
무엇이 문제와 관련 있고 무엇이 관련 없는지 질문자가 임의로 판단하면 곤란합니다. 만약 딱 보고 그걸 판단할 능력이 있다면 질문할 필요도 없는 고수이겠지요.^^
쿼리문의 어느 부분이 유의미한지, "똑같이 작성하여 서로 다르지 않다"는 말씀이 사실인지 아닌지도 모두 답변자가 판단할 사항이라는 뜻입니다. 질문글에서는 있는 그대로의 증상을 최대한 자세히 올려주시기만 하면 됩니다.
무작정 모든 정보를 내놓으라고 갑질하는 것이 아니라, 다른 부분이 있을지도 모른다는 합리적인 의심이 들기 때문에 요청하는 것입니다. 예를 들어 위의 스샷에는 "LIMIT 12"가 붙어 있으므로 12개 이상 불러왔을 리가 없는데, 아래 스샷에는 "찾은 행: 433"이라고 나옵니다. 정렬 방식이나 검색 조건에 차이가 있는 게 아닌가 하는 의심이 들 수밖에요.^^
정렬 방식, 검색 조건, 반환하는 행의 갯수까지 완벽하게 동일한 쿼리인데도 소요시간이 다르다면 웹서버와 DB서버 사이의 네트워크 상태를 의심해 볼 수도 있겠습니다. 예를 들면 국내 통신사 IDC에서 아마존 RDS에 접속한다거나...
뭐 의심되는거라면 검색 컬럼에 인덱스가 잘 안짜여져있다던지
인덱스를 타지 않는 검색 조건을 걸고 있다던지..
조인 조건에서 인덱스를 안탄다던지..
위에 것들 확인해보시면 될거 같네요
+) 어차피 디버그 페이지에 쿼리를 전부 공개해도 딱히 보안상 문제되는건 없습니다.
변수같은건 전부 ? 로 나오기도 하고 말이죠
특히 DB같은경우 쿼리만 볼게 아니라 테이블 상태나 컬럼 설정도 종합적으로 보아야 하는데, 공개가 어려우시다면 돈주고 비공개로 의뢰하시면 빠르게 해결이 가능할것 같네요
"라이믹스에서 호출하는것과 DB에서 직접호출하는게 속도차이나는것에 대해서 여쭤봤는데"
말씀하신 부분을 본문에서 찾을수가 없습니다..
제가 이해한 글 내용은 다음과 같습니다
"라이믹스에서 쿼리를 실행하면 1.4초, 3.6초와 같이 쿼리 속도가 느려집니다."
"그런데 제가 해당 쿼리를 직접 실행해보면 0.0초밖에 나오지 않습니다."
"이러한 현상을 겪어보신 분들이나 해결할 수 있는 방법이 있을까요?"
오리엔님께서는 문제에 대한 "해결 방법"을 물어보셨습니다.
그렇기에 저희는 해답을 찾기 위해 어떤 쿼리가 문제인지 봐야겠죠
그러나 오리엔님께서 문제가 되는 쿼리의 일부를 가려두셨으니, 해당 테이블의 구조를 볼수도, 쿼리를 테스트해볼수도 없죠.
예시를 들어볼께요
(3x)^3 + [ ] = 10
이 식을 푸는 방법을 모르겠습니다
문제는 숙제를 내주신 선생님에게 들키면 안될거 같으니 일부를 가리고 올리겠습니다
x의 값은 뭔가요?
질문자님께서는 이 질문에 어떻게 답변을 해주실건가요?
가린 부분에는 x가 더 있을수도, 없을수도, y가 생길수도, 혹은 아무것도 없을 수도 있죠
질문자분께서는 이 친구가 왜 답을 구하지 못했는지 원인을 명확하게 판단하실 수 있으신가요?
저희도 동일합니다
질문자분께서 "라이믹스에서 호출하는것과 DB에서 직접호출하는게 속도차이가 있나요?" 라고 질문해주셨다면 저희는 "아니요, 차이가 없습니다. 다른 부분을 찾아보세요." 라고 답변을 드렸을겁니다.
그러나 질문자분께서는 "이 문제의 해답"을 질문하셨기 때문에 "저희는 문제를 보지 못하고 답을 구하지 못합니다" 라고 이구동성으로 말하고 있는것지요
문제를 가리고 해답을 찾을 수 있다면 그건 답변자분이 대단한 마법을 부리고 계시거나 사기를 치고있는 것이겠죠 ㅎㅎ
잡설이 길었습니다.
더 정확히 말하자면 저희는 쿼리 뿐만이 아니라, 어떤 데이터를 쿼리에 집어넣으셨는지도 보아야 합니다.
다만 이 부분은 보안상 문제가 있을 수도 있고, 대충 쿼리를 보면 어떤 데이터를 넣었을지 알거 같으니 필요할 경우에만 요청을 드리죠
그러나 쿼리를 가려버리시면 문제가 되는 부분도 예측할 수 없으니 답변을 드리기 어렵습니다
다음에 질문을 주실때는 가리는 부분 없이 쿼리와 환경, 어떤 작업을 하셨는지와 같이 많은 정보를 주시면 더 좋을것 같습니다.
답글로 질문주신것을 답변해보자면
디버그패널에 나오는 쿼리에 경우, 라이믹스에서 실제로 실행한 쿼리를 표시해주게 됩니다.
또한 DB서버와 라이믹스가 돌아가는 서버를 분리하신게 아니라면 실행할때 시간 차이는 0에 가깝습니다.
그러하니 데이터까지 정확히 "동일한" 쿼리를 실행하신게 맞는지 확인해주실 필요가 있어보이고요
사용하는 쿼리가 같다면 호출 위치와 상관없이 동일한 인덱스를 타게 됩니다.
답변이 되었다면 좋겠습니다 :D
도와드리고 싶지만, 꼭 필요한 부분을 너무 많이 가리셔서
저도 답을 ???????? 가려야 ???????? 할 것 같습니다.
인간적으로 쿼리 몇 개는 처음부터 끝까지 ???????? 보여주셔야 하는 거 아닌가요...