2016-06-29 2 views
1

내 솔루션 : 와 나는 (YYYY-MM-그들을 년 (YYYY), 월 (YYYY-MM) 및 일의 이름을 테이블에 세 새 열을 추가최적화 MySQL의 쿼리 성능

알렉스의 도움 @ DD)와 테이블에 3 인덱스를 추가 :

alter table vaadin_table add index (year, status); 
alter table vaadin_table add index (month, status); 
alter table vaadin_table add index (day, status); 

지금 내 쿼리는 다음과 같습니다

select year,status, count(1) from vaadin_table group by year, status; 
select month,status, count(1) from vaadin_table group by month, status; 
select day,status, count(1) from vaadin_table group by day, status; 

I 2 초에 결과를 얻을 수 있습니다! 모든 도움을 주셔서 감사합니다, 정말 감사드립니다! MySQL을 내 원래의 게시물 쿼리

편집을 작동하지 않았다 만드는 인덱스 컬럼에 대한 지원 기능을 나던 것 같다 : 모든 답변에 대한 감사합니다.

제 질문을 명확히하십시오. 나는 테이블에서 매일/월간/연간 통계를 얻어야합니다.

따라서 I를 위하여 매일/매월/매년의 데이터 그룹화 아래 사용

문자열 (ENTRY_DATE, 1, 11) ---> YYYY-MM-DD

문자열 (ENTRY_DATE 1 7) ---> YYYY-MM

문자열은 (ENTRY_DATE는 1, 4) ---> YYYY

그 모든 3 열은 내 쿼리가 느린 있습니다.

원래 질문 : 나는 270 만 행 테이블을 가지고 있습니다. 이름, 상태 및 ENTRY_DATE (YYYY-MM-DD HH : MM : SS) 내 목적은 상태에 따라의 일상 번호를 얻을 수 있습니다

CREATE TABLE IF NOT EXISTS test_table 
(id integer not null auto_increment primary key, 
name char(20) not null, status char(20) not null, 
entry_date datetime default 0); 

:

SELECT substring(entry_date, 1, 11), status, count(1) 
FROM test_table 
GROUP BY 
substring(entry_date, 1, 11), status; 

그것은 작품은 3 열을 포함 괜찮지 만 결과를 반환하는 데 약 10 초가 걸립니다. 모든 순서에 의해 그룹에 인덱스를 추가하는 것이 좋습니다, 내가 라인에 대한 몇 가지 비슷한 질문을 읽을

ALTER table test_table ADD INDEX test_index(entry_date, status); 

:

그것을 최적화하기 위해, 나는 같은 테이블에 인덱스를 추가 할 수 있습니다. 하지만 제 경우에는 도움이되지 않습니다. 내가 entry_date의 부분 문자열을 사용하고 있기 때문입니까?

도와주세요, 감사

+0

입국 날짜는 날짜 시간 값을 다음에 인덱스를 만들? –

+0

왜'substring (entry_date, 1, 11)'하지만'entry_date'가 아닌가? – Alex

+0

정확합니다; 조건 또는 그룹화에서 인덱싱 된 필드의 모든 함수를 사용하면 해당 조건 또는 그룹화에 대한 인덱스가 무시됩니다. 불행하게도 CAST 나 datetime 필드의 날짜를 가져 오는 데 사용할 수있는 다른 날짜 함수를 사용하는 작업까지 포함됩니다. – Uueerdo

답변

2
SELECT entry_date, status, count(1) 
FROM test_table 
GROUP BY 
DATE(entry_date), status; 

또는 더 나은

ALTER TABLE test_table ADD COLUMN entry_date1 DATE; 
UPDATE test_table SET entry_date1=DATE(entry_date); 

SELECT entry_date1, status, count(1) 
FROM test_table 
GROUP BY 
entry_date1, status; 
+0

나는 그것을 더 정확하게 만들기 위해 나의 질문을 업데이트했다. – haifzhan

+0

업데이트가 변경되지 않습니다. 모든 레코드에 대해 호출되는 모든 함수는 성능을 저하 시키며 어떤 인덱스도 사용하지 않습니다. – Alex

+0

어떻게 이러한 시나리오를 해결할 수 있을까요? 많이 고맙게 여기며 – haifzhan

1

그것을 최적화하기 위해 DATE 유형 여분의 열을 추가, 내 제안은

SELECT date(entry_date), status, count(1) 
FROM test_table 
GROUP BY 
status,date(entry_date); 
변경 쿼리

아래로 당신이 성능 어떤 이유로 느려지 며 그것은이에 대한 하위 문자열을하는 이유

는 열 순서를

ALTER table test_table ADD INDEX test_index(status,entry_date); 
+0

그러면 답장을 보내 주셔서 감사합니다. –

+0

에 의해 그룹을 수행 할 때 상태 색인을 활용합니다. – haifzhan