2011-11-14 2 views
1

나는 (결과와 관련하여) 다소간 좋은 쿼리가 있지만 처리하는데 약 45 초가 걸립니다. GUI에서 데이터를 표시하기에는 너무 길다.
그래서 내 요구는 훨씬 빠르고 효율적인 쿼리를 찾는 것입니다. (몇 밀리 초 정도의 것이 좋을 것입니다.) 내 데이터 테이블에 ~ 2,619,395 개의 항목이 있고 여전히 커지고 있습니다.mysql 쿼리 - 거대한 테이블에 대해 기존 MAX-MIN 쿼리를 최적화합니다.

스키마 다음 exportValue 항상 exportValue 내 경우에는 실제 절대 값

  • 을 대표하는 10 연가
  • 를 증가한다

    • num | station | fetchDate    | exportValue | error 
      1 | PS1  | 2010-10-01 07:05:17 | 300   | 0 
      2 | PS2  | 2010-10-01 07:05:19 | 297   | 0 
      923 | PS1  | 2011-11-13 14:45:47 | 82771  | 0 
      

      설명

    • 모든 ~ 15 분 테이블에 10 개의 새로운 항목이 기록됩니다.
    • 012 몇 가지를 작성

      1. :

        select 
            YEAR(fetchDate), station, Max(exportValue)-MIN(exportValue) 
        from 
            registros 
        where 
            exportValue > 0 and error = 0 
        group 
            by station, YEAR(fetchDate) 
        order 
            by YEAR(fetchDate), station 
        

        출력 : 거기에

        Year | station | Max-Min 
        2008 | PS1  | 24012 
        2008 | PS2  | 23709 
        2009 | PS1  | 28102 
        2009 | PS2  | 25098 
        

        내 생각 3,516,

      2. 오류가 적절한 작업 역

    근무 쿼리에 대한 단순한 지표이다 같은 문 사이의 검색어 ' 2008-01-01과 2008-01-02 사이 'MIN (exportValue)을 가져오고 2008-12-30과 2008-12-31 사이에 MAX (exportValue) 가져 오기 - 문제 : 많은 쿼리와 지정된 시간 범위에 데이터가없는 문제 (데이터가있을 것이라는 보장이 없음)

  • 결과 집합을 MIN (fetchDate)에 의한 주문만으로 내 10 개 스테이션으로 제한 - 문제 : 또한 문제를 처리하는 데 오랜 시간이 걸립니다. 쿼리
  • 추가 정보 :
    나는 자바 응용 프로그램에서 쿼리를 사용하고 있습니다. 즉, 필요한 경우 결과 세트에서 일부 후 처리를 수행 할 수 있습니다. (JPA 2.0)

    도움/접근 방식/아이디어는 매우 높이 평가됩니다. 미리 감사드립니다.

    답변

    1

    적절한 색인을 추가하면 도움이됩니다. 2 복합 인덱스가 크게 일을 가속화합니다

    ALTER TABLE tbl_name ADD INDEX (error, exportValue); 
    ALTER TABLE tbl_name ADD INDEX (station, fetchDate); 
    
    +0

    인덱스를 작성해 주셔서 감사합니다. 나는 그것에 관한 좀 더 많은 정보를 찾기 위해 구글을 사용했다 -> http://www.sitepoint.com/optimizing-mysql-application (누군가가 관심이 있다면). 내 쿼리가 5 초 이내에 처리됩니다. 불행히도 오직 phpMyAdmin의 SQL 콘솔을 사용할 때만 JPA 2.0으로 Java에서 쿼리를 처리 할 때가 아닙니다 :/(하지만 그걸 살펴볼 것입니다) – RonH

    0

    3000 개 기록에서 실행이 쿼리는 매우 빠르게해야합니다.

    제안 :

    • 당신은 PK는이 테이블에 설정해야합니까? 역, fetchDate?
    • 인덱스 추가; 당신은 실험을하고 풍부한 인덱스를 시도해야합니다.okelly 그의 대답에 제안했다.
    • 인덱스가있는 실험에 따라 쿼리를 하나의 저장 프로 시저에서 여러 구문으로 분리 해보십시오. 이 방법 당신은 클라이언트에서 mysql로 ​​전송 된 여러 쿼리 사이의 네트워크 트래픽을 느슨하게하지 않을 것입니다.
    • 당신은 별도의 쿼리를 시도했으며 특정 달에 대한 데이터가없는 경우 문제가 있다고 언급했습니다. 그것은 비즈니스 애플리케이션에서 일반적인 경우이며, "마스터 쿼리"(저장 프로 시저 또는 응용 프로그램 코드)에서 처리해야합니다.
    • 추측 fetchDate는 레코드 삽입 순간의 현재 날짜 및 시간입니다. month, station, max (exportValue), min (exportValue) - 지난 달 데이터를 필드 요약 테이블에 보관하는 것을 고려하십시오. 이는 매월 말 요약 테이블에 요약 레코드를 삽입해야한다는 것을 의미합니다. 테이블이 빠르게 (15 분 간격) 성장 당신은 계정에 마지막 제안을해야하기 때문에 삭제는 유지 또는 별도의 테이블에 상세 기록을 이동하는 당신의 선택

    입니다. 아마도 한 곳에서 자세한 기록을 유지할 필요가 없을 것입니다. 데이터 보관은 유지 관리의 일환으로 수행되어야하는 프로세스입니다.

    +0

    제안 해 주셔서 감사합니다. 나는 엔트리의 양에 대해 잘못된 값을 썼다. 그것은 3,000 배 이상이다. :/(2008 년까지의 데이터는 일출부터 일몰 [태양 광 발전소의 데이터베이스 내용 데이터]까지 매일 15 분마다 추가되었다.)). 나는 데이터베이스가 클라이언트에 속한다는 것을 잊어 버렸다. 그래서 난 정말 새로운 필드 등을 추가하여 그것을 수정할 수 없습니다.하지만 내 로컬 덤프에 색인 물건을 테스트했습니다. phpMyAdmin의 SQL 브라우저에서 작성된 쿼리는 JPA 2.0이 아닌 JavaApplication에서 처리 속도가 빠릅니다. ( – RonH

    +0

    불행히도 도움을받지 못했습니다. 정말 유감 스럽지만 JPA에 익숙하지 않습니다. 당신이 작성한대로 쿼리를 실행하지 않을 수도 있습니다. 아마도 "JPA에서 더 느리게 쿼리가 작동합니다"와 같은 다른 질문을 열어 봐야합니다. –

    관련 문제