사용중인 DB는 MYSql입니다.
정확한 쿼리부탁드려요 ㅜㅜ
데이터량이 많다보니..index설정도 생각해야할거같은데ㅜㅜ
1. member 테이블의 attributes
mem_num, mem_id, mem_residentno, mem_state
2. product 테이블의 attributes
prod_num,prod_name,prod_price
3. order_info 테이블의 attributes
ord_info_num,ord_mem_id,ord_product,ord_message
4. order_prod 테이블의 attributes
ord_num, ord_info_num, ord_prod_num
테이블과 각 attribute의 관계 :
member.mem_id = order_info.ord_mem_id
order_info.ord_info_num = order_prod.ord_info_num
order_prod.ord_prod_num = product.prod_num
제품명 | 10대 이하 | 20대 | 30대 | 40대 이상 |
제품 1 | --- | --- | --- | --- |
제품 2 | --- | --- | --- | --- |
제품 3 | --- | --- | --- | --- |
위 와 같은 결과를 얻으려고하는데..
각 연령 별로 제품(상품)들에 대하여 통계를 구하려고합니다...
질의를 어떻게해야 결과가 나올까요...
일주일 내내 이것만 하고있는데...ㅜㅜ join, select 뭘 해봐도 안되서 질문올립니다.
===============================================================
select y.prod_hname,t.age10,t.age20,t.age30,t.age40
from ( select ord_prod_num as prod_id,sum(case when (year(now())-1900)-substring(c.mem_residentno,1,2) > 20 then 1 else 0 end) as age10,
sum(case when (year(now())-1900)-substring(c.mem_residentno,1,2) between 20 and 29 then 1 else 0 end) as age20,
sum(case when (year(now())-1900)-substring(c.mem_residentno,1,2) between 30 and 39 then 1 else 0 end) as age30,
sum(case when (year(now())-1900)-substring(c.mem_residentno,1,2) >= 40 then 1 else 0 end) as age40
from order_prod_list a
inner join order_Info_list b
on a.ord_info_num = b.ord_info_num
inner join member c
on b.ord_mem_id = c.mem_id
group by ord_prod_num order by ord_prod_num
) as t
inner join Product as y
on (t.prod_id = y.prod_num) order by t.prod_id asc
==================================================================
위와 같이 쿼리를 만들어보니 결과는 제대로 나왔으나... 시간이 너무 오래걸립니다. 데이터량이 워낙 많아서...
explain 을 사용하여 결과를보니...index를 타지 않는거같은데...
index를 타려면 어떻게해야할까요 ? 그리고 어떻게 인덱스를걸어줘야할지 상세하게 설명부탁드립니다.ㅜ
mysql..
오더랑 조인해서 매번 통계를 내는게 이상한 것 같습니다.
실무를 하는 저도 로그성 데이터는(오천만~일억건 되나요?) 통계 쿼리로 결과를 보여주려는 시도하지 않습니다.
1. 정확한 업무(기획?) 이해
2. 어떤 통계 데이터가 필요한지 분석
3. 일별 통계 테이블 생성(에이전트;사용이 드문 시간)
4. 결과 뷰는 일별 통계 테이블만 쿼리~
테이블을 만들고 쿼리로 전부 하려고 할게 아니라! 다른방법으로 시도하시는게..
방법은 많아요. 저 오더가 일억 이상개의 데이터를 예상한다면 인덱싱을 한다고해도 ^^