2013-06-18 2 views
0

나는 약 30M 레코드가있는 테이블을 가지고 있으며 크기는 6.6GB입니다. 나는 그것에서 일부 데이터를 쿼리하고에 의해 그룹을 사용하여 주문해야합니다. 그것은 데이터를 쿼리하는 데 너무 오래 걸립니다, 나는 여러 번 DB에 연결을 잃었 ...mysql에서 대형 테이블을 최적화하는 방법은 무엇입니까?

나는 키와 합성 키로 모든 필수 필드에 대한 색인을 가지고 있습니다. 쿼리를 더 빨리 수행하려면 어떻게해야합니까?

예 쿼리 : 쿼리 쿼리입니다

select id, max(price), avg(order) from table group by id, date order by id, location. 
+1

물론 원하는 열만 지정하고 선택 쿼리에서는 *를 사용하지 않아야합니다. –

+1

어디서나 WHERE 절을 사용하고 있습니까? 30M + 레코드를 가져 오는 경우 느린 동작이 예상됩니다. 실제로 PHP 스크립트가 시간 초과 될 수 있습니다. –

+1

당신에게 옵션인지 모르겠지만 맵 축소 패러다임을 사용하는 mongodb 또는 couchbase와 같은 nosql 데이터베이스에서이를 수행하는 것이 좋습니다. – jbaylina

답변

0

사용 EXPLAIN query. 예 : EXPLAIN select * from table group by id, date order by id, location.

MySQL이 쿼리를 분석하고 인덱스를 찾는 테이블을 볼 수 있습니다. 아마 충분한 (신 충분한) 색인이 없을 것입니다.

+0

나는 이것을 전에 시도했다. 그러나 mysql에서 이것은 올바른 답을주지는 못한다. 예를 들어 이미 id에 대한 인덱스가 있지만 select *를 id로 테이블 순서에서 설명하면 키 아래에 null이 표시됩니다. – Suanmeiguo

+0

@Suanmeiguo는 explain 서술문의 정확한 출력을 붙여 넣을 수 있습니까? 이것은 당신에게 어떤 힌트를주기 위해 많은 도움이 될 것입니다. – ducin

0

나는 그렇게 생각하지 않습니다. 필터 (WHERE 절) 및 AVG가 없으면 전체 테이블을 읽어야합니다.

내가 생각할 수있는 유일한 것은 ID, AVG_ORDER, MAX_PRICE (또는 필요한 것이 무엇이든)로 새 테이블을 만들고 새 행을 삽입/업데이트 할 때 트리거 또는 저장 프로 시저를 사용하여 업데이트하는 것입니다.

ID에 대한 색인 인 PRICE 색인은 성가신 평균이 필요하지 않은 경우 도움이 될 수 있습니다.

0

색인 생성은 사용자에게 도움이되지 않습니다. 당신은 열을 평균하고 있으므로 테이블의 모든 열을 읽어야합니다. 시간이 걸릴 것입니다.

관련 문제