2010-08-13 4 views
0

저는 현재 매우 잘 수행되지 않는 분석 시스템을 구현했습니다. 시간별 통계 (stats_id, FILE_ID 시간) 표 2에 대한 기록을 포함합니다 : 8 백만 행을 포함 그것을 설명하기 위해 나는 테이블 구조는 내가 두 InnoDB의 테이블 최적화를위한 웹 로그 분석

표가

를 쿼리 설명 할 필요가있다.

표 2 구조는

는 내가 뭘하려고 FILE_ID에 의해 주어진 기간에 대한 hourly_stats에서 전체보기 및 그룹화 기록을 계산하는 다음의 I/추가)

full_stats (
    stats_id Int 
    file_id Int 
    stats_week Int 
    stats_month Int 
    stats_year Int 
    stats_time DATETIME 

입니다 full_stats 테이블로 레코드를 갱신하십시오. 평균적으로 한 행을 처리하는 데 1-2 분이 소요됩니다. 더 나은 성능을 위해 쿼리를 최적화하려고합니다. 여기

내가 뭐하는 거지입니다

이미 존재하지 않는 것으로되어 주어진 주, 월, 년 40 %의 가능성에 대한 full_stats에 존재 FILE_ID 60 %의 가능성이 있습니다.

그래서 첫 번째 쿼리에 나는 제로 나는이 레코드를 삽입한다 영향을받는 행 만약 내가 확인 쿼리 그 이후

UPDATE full_stats 
    SET total_views=XXX 
WHERE stats_week=XX stats_month=X 
    AND stats_year=YYYY 

다음 사용하여 레코드를 업데이트하려고합니다. 삽입 또는 업데이트가 완료되면 hourly_stats의 레코드는 file_id 및 주어진 기간에 따라 제거됩니다.

쿼리를 최적화하고 잠금 속도를 줄이는 방법에 대한 제안 사항을 제공해 줄 수 있습니까?

+0

이 테이블에 어떤 종류의 색인을 설정 했습니까? – FrustratedWithFormsDesigner

+0

SSD를 RAID 어레이에 조인하면 I/O 속도가 빨라집니다. 진심으로? 색인이 추가되는 한 빨리 수행 할 수 있습니다. 모든 최적화는이 경우 성능을 향상시키지 않습니다. 어쩌면 당신은 시스템의 전체적인 재 설계를보고있을 것입니다. 단 한 지점을 밀어 넣으면 다른 지점을 잃게되고, 더 잘 할 수있는 것을 알아 내기위한 세부 사항이 너무 적기 때문에 여기에 단서를 줄 수는 없습니다. – AlexanderMP

+0

나는 주, 월, 년에 색인을 추가하려했지만 성능이 매우 느려서 제거해야했습니다. – Maximus

답변

1

인덱스를 삽입/업데이트 할 때마다 인덱스를 다시 작성하거나 업데이트해야하는 경우 성능이 저하됩니다. 이것은 정기적 인 색인을 사용하는 것이 더 쉽습니다.
그러나 귀하의 경우에는 고유 인덱스가 필요합니다. 이것으로 당신은이 문제가 없을 수도 있습니다.

테이블이 InnoDB 엔진을 사용하고 고유 인덱스가 (stats_year, stats_month, stats_week) 인 지 확인하십시오.

그런 다음 먼저 업데이트를 수행 한 다음 영향을받은 행을 확인하고 필요한 경우 삽입하는 대신 INSERT...ON DUPLICATE KEY UPDATE을 사용하십시오. 이 방법으로 40 %의 사례에서 이전의 업데이트 진술을 할 수있었습니다.
고유 한 색인은이 문장에서 매우 중요합니다.

관련 문제