mysql 이상현상때문에 고생중입니다... 이런적 있으신분 계신가요.

김제연   
   조회 7562   추천 0    

 비트코인 사이트 긁어다가 뭐좀 할게 있어서 ..  

하루에 100만개 데이터를 저장해서 .. 끌어오는 중입니다.. 

mysql workbench 에서는 

select id FROM bitrex_nt where market = 'BTC-GEO' and created_at >= date_add(now(),interval -4 hour) group by rank

해당 쿼리가 .. 0.03초 정도 걸립니다... 코인이름마다 조금씩 차이는 있지만 0.0x 대로 끝납니다..

그런데 .. 웹이랑 붙여서 가져오는데 .. 7초가 넘어도 안나오길래 서버로 직접 들어가서 mysql 커맨드 클라이언트로

같은 쿼리를 날리면.. 8~9초가 걸리네요... 

다시 workbench 와서 .. 해보면.. 0.0x대구요 ... 혹시 캐시 때문에 그런가 싶어서 workbench 다시 실행 하고 .. 

-4 시간을 24시간 market 네임도 바꿔보고 해도 .. 0.0x 대에 결과가 금방 나옵니다.. 

근데 서버 들어가서 하면... 6~8초 등등 엄청 오래 걸리네요 ㅜㅜ


MariaDB [cryptocoin]> select id FROM bitrex_nt where market = 'BTC-GEO' and created_at >= date_add(now(),interval -4 hour) group by rank;
+---------+
| id      |
+---------+
| 2203074 |
| 2225053 |
| 2192782 |
| 2246441 |
| 2249412 |
| 2253576 |
| 2264269 |
+---------+
7 rows in set (10.51 sec)

위는 mysql

아래는 workbench 입니다.

17:32:02select id FROM bitrex_nt where market = 'BTC-GEO' and created_at >= date_add(now(),interval -4 hour) group by rank LIMIT 0, 500007 row(s) returned0.031 sec / 0.000 sec

왜 이런걸까요? ㅜㅜ 쿼리 캐시라면.. workbench 도 빠르고 mysql에서도 빨라야 할것 같은데 말입니다. 

무엇때문에 이런  현상이 나는지 짐작 가는거 있으시면 답변좀  부탁 드릴게요.

짧은글 일수록 신중하게.
욱가 2017-11
제 빈약한지식이지만 워크벤치에서는 쿼리문에 LIMIT 이 자동으로 붙여서 들어간것은 아닐까요??
Workbench  Preferences. 에서 SQL Editor 탭 Under SQL Execution 에서 Limit Rows가 체크되어있는지 한번확인해보시면 확실할거같네요
     
욱가 2017-11
아 쿼리결과가 본문에있었군요 ㅠㅠ 리밋문제는아니겠습니다.. 신기하네요 cui 기본클라이언트하고 워크벤치툴이 결과가 저렇게 상이하다니...
쿼리를 툴이 자체적으로 옵티마이즈하거나 결과가 캐싱되는게아니라면 cui환경보다 더빠를수가있나요??
mjxaone 2017-11
일단 index 문제일수도 있고, 어쩌다 다른 쿼리와 맞물려서 콘솔쪽에서 그 시간에 쿼리를 날려서 그럴수도 있구요.
explain 명령으로 쿼리를 살펴보고, 개선하는 방법이 우선일것 같구요.
저같은경우, 한 테이블로 몇백만씩 쌓아두진 않고(저만 그런진 모르겠지만 row수가 백만단위로 넘어가면 꽤 느려지더라구요),  날짜별로 테이블을 따로 짜기도 하고,
조회용 테이블을 따로 만들어서 저장하기도 하구요.
백만이 넘는 테이블에서 직접적으로 select하는것은 그 빈도가 굉장히 적도록 또는, 시간이 걸려도 상관없는 작업에만 사용하고 있어요.
     
김제연 2017-11
네  . 그냥  각각 created_at 이랑 market  에만 인덱스를 줬다가 그때는.. 그냥 쿼리문으로도 3초가 넘게 걸려서
created_at 랑 market 두개 복합인덱스로 줬더니 .. 0.0대로 들어와서 .. 이제 됐네 .. 하고 사용할려는 찰라에
웹에서 뿌려주는데 엄청 느리길래 보니까 .. 지금 이상황이네요.. workbench 에서는 빠르고 ..
mysql 클라이언트에서는 느리고요.
김제연 2017-11
위에 보시는것처럼 .. row가 7개가 끝입니다. 그 리밋은.. 50000이면 50000개의 데이터가 넘어갈때 .. 짤라 주는 것 아닌가요.
     
mjxaone 2017-11
예. limit 문제는 아닌것 같아요.
DAP박인호 2017-11
결과가 동일한데... 실행 시간이 다르다니
알수 없는 현상이네요.

explain 명령으로 두 환경에서 plan이 다르게 동작하는지 확인해 보세요.
     
김제연 2017-11
똑같이 작동 됩니다.
근데 .. 좀 의아한게 .. explain 명령어를 잘 보질 못해서 그러는지 모르겠습니다만
select type table    type  possible_keys    key  keylength ref row            Extra
SIMPLE    bitrex_nt  ALL    created                                      2370886    Using where;Usingtemporary,Usingfilesort

이렇게 나옵니다 제가 줏어 듣기론 type 에 ALL 이 나오면 풀서치로 엄청 느려야 하는게 아닌가요?
          
mjxaone 2017-11
group by rank 쪽때문인것 같은데, rank 도 인덱스로 잡아주실수 있어요?
               
김제연 2017-11
rank 를 빼도 속도는 별 차이가 없습니다.
group by 를 빼면

key created key len 89
row 585062
Extra Using where;Using index

로 뜨고  0.047 초가 걸립니다.

서버쪽은 explain 결과는 똑같이 나오며
시간은 9.51 초가 걸리네요.
                    
mjxaone 2017-11
위에서 제가 limit 문제가 아니라고 쓰긴 했는데, limit 를 걸어주실수 있나요,
똑같진 않지만, 비슷한 환경으로 만들어두고 테스트 해보고 있는데, limit를 주고/말고의 차이  말고는 성능 차가 없네요.
                         
김제연 2017-11
허  .. 이거 신기방기 한데요 ..
말씀데로 .. limit 를 붙여주니 .. 속도가 빨라졌습니다 workbench 만큼이요 ..
limit 는.. 최종값에 일부분만 가져오는걸로 알고 있는데 .. 뭐 다른 기능이 있는건가요?
group by 없이 쿼리하면 800 개 가량 나오고  .. group by 하면 7개가 되는데 ... 이렇게 하면 9초 가량 걸리는데 ..
뒤에 limit 10이든 5000 이든 붙이면.. 0.03 초면 끝나네요?
mjxaone 2017-11
논외일수도 있는데, 쿼리쪽도, group by rank 가 걸려있는 상태인데, id를 출력하는게 원하는 결과인지도 궁금합니다.
     
김제연 2017-11
원래 * 를 출력 하는건데 .. 혹시나 싶어서 ..primary 키만 출력하면 좀 빨라질까 싶어서 .. 바꿔본겁니다.. 말씀하신데로 아무 의미 없는 limit 를 달아줬더니 엄청 빨라졌습니다.. 이거 왜 그런지 설명해주실 수 있으실까요?
김제연 2017-11
MariaDB [cryptocoin]> select * FROM bitrex_nt where market = 'BTC-GNO' and created_at >= date_add(now(),interval -4 hour) group by rank limit 5000;
+---------+---------+--------+------------+--------+--------------+-------------+-------------+--------+------+----------+--------+---------------------+
| id      | market  | spread | added      | change | dayhighprice | daylowprice | lastprice  | volume | rank | currency | symbol | created_at          |
+---------+---------+--------+------------+--------+--------------+-------------+-------------+--------+------+----------+--------+---------------------+
| 2377492 | BTC-GNO | 0.3%  | 2017-04-28 | 3.4%  |  0.008822450 | 0.008417040 | 0.008800000 | 9.8420 |  147 | Gnosis  | GNO    | 2017-11-08 17:45:22 |
| 2377295 | BTC-GNO | 0.3%  | 2017-04-28 | 3.7%  |  0.008822450 | 0.008417040 | 0.008822450 | 9.8420 |  148 | Gnosis  | GNO    | 2017-11-08 17:45:03 |
| 2288790 | BTC-GNO | 2.1%  | 2017-04-28 | 0.9%  |  0.008789260 | 0.008417040 | 0.008763300 | 9.3500 |  149 | Gnosis  | GNO    | 2017-11-08 15:43:50 |
| 2284435 | BTC-GNO | 2.1%  | 2017-04-28 | 0.9%  |  0.008789260 | 0.008417040 | 0.008763300 | 9.3500 |  150 | Gnosis  | GNO    | 2017-11-08 15:37:37 |
| 2268596 | BTC-GNO | 0.3%  | 2017-04-28 | 0.9%  |  0.008789260 | 0.008417040 | 0.008763160 | 9.2090 |  151 | Gnosis  | GNO    | 2017-11-08 15:16:40 |
| 2264835 | BTC-GNO | 0.3%  | 2017-04-28 | 3.0%  |  0.008789260 | 0.008417040 | 0.008763090 | 8.9300 |  152 | Gnosis  | GNO    | 2017-11-08 15:11:53 |
| 2248006 | BTC-GNO | 0.1%  | 2017-04-28 | 0.9%  |  0.008770000 | 0.008417040 | 0.008763020 | 8.8170 |  153 | Gnosis  | GNO    | 2017-11-08 14:48:30 |
| 2245631 | BTC-GNO | 0.1%  | 2017-04-28 | 0.9%  |  0.008770000 | 0.008417040 | 0.008763020 | 8.7760 |  154 | Gnosis  | GNO    | 2017-11-08 14:45:16 |
| 2242662 | BTC-GNO | 0.1%  | 2017-04-28 | 0.8%  |  0.008770000 | 0.008417040 | 0.008763020 | 8.6290 |  155 | Gnosis  | GNO    | 2017-11-08 14:41:13 |
| 2241277 | BTC-GNO | 2.6%  | 2017-04-28 | 0.8%  |  0.008760000 | 0.008417040 | 0.008760000 | 8.4630 |  156 | Gnosis  | GNO    | 2017-11-08 14:39:28 |
| 2229993 | BTC-GNO | 2.7%  | 2017-04-28 | 0.8%  |  0.008760000 | 0.008417040 | 0.008759990 | 8.1280 |  158 | Gnosis  | GNO    | 2017-11-08 14:23:22 |
+---------+---------+--------+------------+--------+--------------+-------------+-------------+--------+------+----------+--------+---------------------+
11 rows in set (0.03 sec)
김제연 2017-11
리밋빼면

MariaDB [cryptocoin]> select * FROM bitrex_nt where market = 'BTC-GNO' and created_at >= date_add(now(),interval -4 hour) group by rank;
+---------+---------+--------+------------+--------+--------------+-------------+-------------+--------+------+----------+--------+---------------------+
| id      | market  | spread | added      | change | dayhighprice | daylowprice | lastprice  | volume | rank | currency | symbol | created_at          |
+---------+---------+--------+------------+--------+--------------+-------------+-------------+--------+------+----------+--------+---------------------+
| 2377492 | BTC-GNO | 0.3%  | 2017-04-28 | 3.4%  |  0.008822450 | 0.008417040 | 0.008800000 | 9.8420 |  147 | Gnosis  | GNO    | 2017-11-08 17:45:22 |
| 2377295 | BTC-GNO | 0.3%  | 2017-04-28 | 3.7%  |  0.008822450 | 0.008417040 | 0.008822450 | 9.8420 |  148 | Gnosis  | GNO    | 2017-11-08 17:45:03 |
| 2288790 | BTC-GNO | 2.1%  | 2017-04-28 | 0.9%  |  0.008789260 | 0.008417040 | 0.008763300 | 9.3500 |  149 | Gnosis  | GNO    | 2017-11-08 15:43:50 |
| 2284435 | BTC-GNO | 2.1%  | 2017-04-28 | 0.9%  |  0.008789260 | 0.008417040 | 0.008763300 | 9.3500 |  150 | Gnosis  | GNO    | 2017-11-08 15:37:37 |
| 2268596 | BTC-GNO | 0.3%  | 2017-04-28 | 0.9%  |  0.008789260 | 0.008417040 | 0.008763160 | 9.2090 |  151 | Gnosis  | GNO    | 2017-11-08 15:16:40 |
| 2264835 | BTC-GNO | 0.3%  | 2017-04-28 | 3.0%  |  0.008789260 | 0.008417040 | 0.008763090 | 8.9300 |  152 | Gnosis  | GNO    | 2017-11-08 15:11:53 |
| 2248006 | BTC-GNO | 0.1%  | 2017-04-28 | 0.9%  |  0.008770000 | 0.008417040 | 0.008763020 | 8.8170 |  153 | Gnosis  | GNO    | 2017-11-08 14:48:30 |
| 2245631 | BTC-GNO | 0.1%  | 2017-04-28 | 0.9%  |  0.008770000 | 0.008417040 | 0.008763020 | 8.7760 |  154 | Gnosis  | GNO    | 2017-11-08 14:45:16 |
| 2242662 | BTC-GNO | 0.1%  | 2017-04-28 | 0.8%  |  0.008770000 | 0.008417040 | 0.008763020 | 8.6290 |  155 | Gnosis  | GNO    | 2017-11-08 14:41:13 |
| 2241277 | BTC-GNO | 2.6%  | 2017-04-28 | 0.8%  |  0.008760000 | 0.008417040 | 0.008760000 | 8.4630 |  156 | Gnosis  | GNO    | 2017-11-08 14:39:28 |
| 2230389 | BTC-GNO | 2.7%  | 2017-04-28 | 0.8%  |  0.008760000 | 0.008417040 | 0.008759990 | 8.1280 |  158 | Gnosis  | GNO    | 2017-11-08 14:23:52 |
+---------+---------+--------+------------+--------+--------------+-------------+-------------+--------+------+----------+--------+---------------------+
11 rows in set (6.72 sec)

걸리네요 .. 이거 무척 허무한데 .. ㅜㅜ
욱가 2017-11
     
김제연 2017-11
ㅎㄷㄷ 영어 까막눈이라 .. 주신 링크를 못보겠네요 ㅜㅜ
그런데 ..limit 는.. 제 결과값이 7 개면.. limit 5줬을때 5개만 보여주는거 아닌가요?

결과값이 7 개 인데.. limit 를 안줘서 엄청 느려진다거나
7개 결과값인데 .. limit  100 이런식으로 주면 빨라지는 이유가 왜그런건지 알 수 있을까요 ..
낮 부터 삽질한 부분이라 ... 왜그런지 알수 있으면 알고 싶네요..
          
mjxaone 2017-11
저도 @김제연 님처럼 이해하고 있습니다만... 모르겠네요.
limit 100을 걸었다면, select 조건에 따라서 limit 걸린것 까지만 연산하고 결과를 바로 보내준다고 알고 있으니까요.
저 책에도 그냥 쿼리를 쓰면 전체를 연산하여 보여주니까, limit를 사용하는게 좋은 방법이다 라고 써져있긴하지만...
결과값이 100도 안될때는, 전체를 연산할텐데.. 뭔 상황인지 모르겠네요.
               
욱가 2017-11
저도 전문 개발자가 아니라 짧은 지식을 갖고있어서 단지 추측정도로 밖에답변을못드리네요 ㅜㅜ

책내용과
http://gubug.tistory.com/m/446 이 포스트내용을 보면
Limit을 거는것만으로도 어느정도 옵티마이징이 내부에서 이뤄지는것은아닌지...

시원한 해답이 저도 궁금하네요
일부 디비툴은 내부에서 결과 값 반환시 일정개수만 가져와서 출력해주고 스크롤시 추가분을 다시 가져오는 형태로 기능 지원하고 있습니다. 즉 limit이 툴 내부에서 포함되어 있는 것으로 보입니다.

웹에서 결과건수가 3000개만 되어도 브라우져는 죽을수도 있거나 공포의 응답대기 상태에서 깨어나지.못하는 싱태가.되기도 합니다.limit 로 화면 페이징 할 수 있도록 변경해주시는 것이 좋을듯 합니다.
     
김제연 2017-11
결과건수는.. 위에 올린것처럼.. 7건이 전부입니다... 웹에서 보여주는것도 7건이고요 .. 7건이라 페이징 할일도 없습니다.

limit 가 필요없는 상황이라 안썼더니  .. 6~9초 다양하게 느려서 ...
질문 드린건데 ...

7건이 다인 쿼리에 limit 100이던 1000 이던 달면.. 0.03 초로 엄청 빨라집니다...
저역시 .. 결과의.. 수를 제한 하는 기능만 하는줄 알았는데 .. 다른 숨겨진 기능이 있나 궁금하네요.
쿼리가 Group by rank 가 아니라 order by rank 가 되어야 하지.않을까요?
     
김제연 2017-11
실시간으로 긁어오다 보니 rank 가 중복으로 들어가서요 .. 정렬하는게 아닌.. rank 중복을 정렬해서 ..rank 의 변화를 보려고 하고 있어서 group by 를 사용하고 있습니다.
김윤술 2017-11
저문제는 MySQL 뿐만이 아니고 MSSQL도 마찬가지입니다. 리미트가 TOP 이랑 같은거일건데 제한을 두지 않으면 트래픽을 소모합니다. 서버 자체에서는 빠른 이유가 로컬대역은 원래 빠르죠. 하지만 한다리 건너면서 그 결과값을 웹서버로 전송해줘야 합니다. 이거 아무것도 아닌거 같지만 범위가 크면 오래걸립니다. 하지만 MySQL 서버에서 하면 오래 안걸리겠죠?
실제 보여줄 결과값이 7개라면 TOP 7  제한을 걸지 않으면 느려지는건 당연한겁니다. DB가 처음엔 건수가 많지 않으면 별로 못느끼겠지만 시간이 흐를수록 데이터량이 커지면 엄청 느려집니다. 건수를 제한하지 않으면 전체건수를 조회하고 7개만 뿌려줄때는 전체를 긁어오는거랑 같은 이치입니다. 하지만 쿼리에 7개만 제한을 걸면 인덱스 타고 결과값 보여줄 트래픽 없고 하면 순식간에 뜰겁니다.


QnA
제목Page 1822/5725
2015-12   1768935   백메가
2014-05   5243607   정은준1
2017-11   4494   가빠로구나
2017-11   6319   김두홍
2017-11   4026   김건우
2017-11   11544   쿰척쿰척
2017-11   4371   두cpu
2017-11   9406   삐돌이슬픔이
2017-11   4197   dongcheol
2017-11   4030   지수삼촌
2017-11   5226   cclim
2017-11   5839   일론머스크
2017-11   4813   dibby
2017-11   4284   acdum
2017-11   8751   정찬용
2017-11   4865   전직P연구원
2017-11   7563   김제연
2017-11   4451   이상율1
2017-11   3826   Psychophysi…
2017-11   4734   김영기
2017-11   4230   김민성
2017-11   3453   LINKINPARK