내 솔루션 : 와 나는 (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의 부분 문자열을 사용하고 있기 때문입니까?
도와주세요, 감사
입국 날짜는 날짜 시간 값을 다음에 인덱스를 만들? –
왜'substring (entry_date, 1, 11)'하지만'entry_date'가 아닌가? – Alex
정확합니다; 조건 또는 그룹화에서 인덱싱 된 필드의 모든 함수를 사용하면 해당 조건 또는 그룹화에 대한 인덱스가 무시됩니다. 불행하게도 CAST 나 datetime 필드의 날짜를 가져 오는 데 사용할 수있는 다른 날짜 함수를 사용하는 작업까지 포함됩니다. – Uueerdo