비트코인 사이트 긁어다가 뭐좀 할게 있어서 ..
하루에 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에서도 빨라야 할것 같은데 말입니다.
무엇때문에 이런 현상이 나는지 짐작 가는거 있으시면 답변좀 부탁 드릴게요.
Workbench Preferences. 에서 SQL Editor 탭 Under SQL Execution 에서 Limit Rows가 체크되어있는지 한번확인해보시면 확실할거같네요
쿼리를 툴이 자체적으로 옵티마이즈하거나 결과가 캐싱되는게아니라면 cui환경보다 더빠를수가있나요??
explain 명령으로 쿼리를 살펴보고, 개선하는 방법이 우선일것 같구요.
저같은경우, 한 테이블로 몇백만씩 쌓아두진 않고(저만 그런진 모르겠지만 row수가 백만단위로 넘어가면 꽤 느려지더라구요), 날짜별로 테이블을 따로 짜기도 하고,
조회용 테이블을 따로 만들어서 저장하기도 하구요.
백만이 넘는 테이블에서 직접적으로 select하는것은 그 빈도가 굉장히 적도록 또는, 시간이 걸려도 상관없는 작업에만 사용하고 있어요.
created_at 랑 market 두개 복합인덱스로 줬더니 .. 0.0대로 들어와서 .. 이제 됐네 .. 하고 사용할려는 찰라에
웹에서 뿌려주는데 엄청 느리길래 보니까 .. 지금 이상황이네요.. workbench 에서는 빠르고 ..
mysql 클라이언트에서는 느리고요.
알수 없는 현상이네요.
explain 명령으로 두 환경에서 plan이 다르게 동작하는지 확인해 보세요.
근데 .. 좀 의아한게 .. explain 명령어를 잘 보질 못해서 그러는지 모르겠습니다만
select type table type possible_keys key keylength ref row Extra
SIMPLE bitrex_nt ALL created 2370886 Using where;Usingtemporary,Usingfilesort
이렇게 나옵니다 제가 줏어 듣기론 type 에 ALL 이 나오면 풀서치로 엄청 느려야 하는게 아닌가요?
group by 를 빼면
key created key len 89
row 585062
Extra Using where;Using index
로 뜨고 0.047 초가 걸립니다.
서버쪽은 explain 결과는 똑같이 나오며
시간은 9.51 초가 걸리네요.
똑같진 않지만, 비슷한 환경으로 만들어두고 테스트 해보고 있는데, limit를 주고/말고의 차이 말고는 성능 차가 없네요.
말씀데로 .. limit 를 붙여주니 .. 속도가 빨라졌습니다 workbench 만큼이요 ..
limit 는.. 최종값에 일부분만 가져오는걸로 알고 있는데 .. 뭐 다른 기능이 있는건가요?
group by 없이 쿼리하면 800 개 가량 나오고 .. group by 하면 7개가 되는데 ... 이렇게 하면 9초 가량 걸리는데 ..
뒤에 limit 10이든 5000 이든 붙이면.. 0.03 초면 끝나네요?
+---------+---------+--------+------------+--------+--------------+-------------+-------------+--------+------+----------+--------+---------------------+
| 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)
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)
걸리네요 .. 이거 무척 허무한데 .. ㅜㅜ
https://books.google.co.kr/books?id=IagfgRiKWd4C&pg=PA203&lpg=PA203&dq=limit+Fetching+more+rows+than+needed+mysql&source=bl&ots=w_a0j-QzFg&sig=ut8KOyA6-hKxpjHUnY9VC2Bal3k&hl=ko&sa=X&ved=0ahUKEwjo-ozY1q7XAhUME7wKHVnVBRIQ6AEIRjAH#v=onepage&q=limit%20Fetching%20more%20rows%20than%20needed%20mysql&f=false
이 책 내용이 설명하는내용이 맞지않을까싶습니다
그런데 ..limit 는.. 제 결과값이 7 개면.. limit 5줬을때 5개만 보여주는거 아닌가요?
결과값이 7 개 인데.. limit 를 안줘서 엄청 느려진다거나
7개 결과값인데 .. limit 100 이런식으로 주면 빨라지는 이유가 왜그런건지 알 수 있을까요 ..
낮 부터 삽질한 부분이라 ... 왜그런지 알수 있으면 알고 싶네요..
limit 100을 걸었다면, select 조건에 따라서 limit 걸린것 까지만 연산하고 결과를 바로 보내준다고 알고 있으니까요.
저 책에도 그냥 쿼리를 쓰면 전체를 연산하여 보여주니까, limit를 사용하는게 좋은 방법이다 라고 써져있긴하지만...
결과값이 100도 안될때는, 전체를 연산할텐데.. 뭔 상황인지 모르겠네요.
책내용과
http://gubug.tistory.com/m/446 이 포스트내용을 보면
Limit을 거는것만으로도 어느정도 옵티마이징이 내부에서 이뤄지는것은아닌지...
시원한 해답이 저도 궁금하네요
웹에서 결과건수가 3000개만 되어도 브라우져는 죽을수도 있거나 공포의 응답대기 상태에서 깨어나지.못하는 싱태가.되기도 합니다.limit 로 화면 페이징 할 수 있도록 변경해주시는 것이 좋을듯 합니다.
limit 가 필요없는 상황이라 안썼더니 .. 6~9초 다양하게 느려서 ...
질문 드린건데 ...
7건이 다인 쿼리에 limit 100이던 1000 이던 달면.. 0.03 초로 엄청 빨라집니다...
저역시 .. 결과의.. 수를 제한 하는 기능만 하는줄 알았는데 .. 다른 숨겨진 기능이 있나 궁금하네요.
실제 보여줄 결과값이 7개라면 TOP 7 제한을 걸지 않으면 느려지는건 당연한겁니다. DB가 처음엔 건수가 많지 않으면 별로 못느끼겠지만 시간이 흐를수록 데이터량이 커지면 엄청 느려집니다. 건수를 제한하지 않으면 전체건수를 조회하고 7개만 뿌려줄때는 전체를 긁어오는거랑 같은 이치입니다. 하지만 쿼리에 7개만 제한을 걸면 인덱스 타고 결과값 보여줄 트래픽 없고 하면 순식간에 뜰겁니다.