2012-05-14 4 views
1

그래서 ... 난 세 개의 테이블이있는 데이터베이스가 가정 :
고객
데이터
clients_to_data을
MySQL의 성능 - "중복"대 속도/시스템 성능

그리고 클라이언트가 테이블 데이터의 데이터에 액세스 할 수 있도록하는 API가 있습니다. 모든 클라이언트는 표, 내가 표에 로그인하고있는 무슨에 액세스하는 사람들 로그인하려면 (IP ADRESS 등과 같은 것들로) 고객을 기록을 가지고 테이블 고객, 테이블 데이터를 ID를 포함 clients_to_data (타임 스탬프)
사용자가 내 API에 액세스 할 때마다 그는 clients_to_data 테이블에 로그인합니다. (따라서 클라이언트에데이터의 레코드는 업데이트되지 않고 그냥 읽습니다.)
또한 클라이언트 당 히트의 양을 얻을 수 있기를 원합니다. 꽤 쉽습니다. clients_to_data 테이블에 client_id를 쿼리하고 결과를 계산하면됩니다. 그러나 DB가 커질수록 clients_to_data 테이블에 수십억 개의 레코드가 생깁니다. 그리고 여기 내 질문 :
이 더 나은 연습 그래서이 될 것이라고 표에 필드 "히트"를 추가 클라이언트 해당 사용자의 안타의 양을 저장을하고 그것을 사용자가 API
를 조회 할 때마다 증가하는 것입니다 내가 일반적으로 들었던 DB에 redundancy을 추가하는 것은 나쁜 일이다. 그러나이 경우에는 조회수를 검색하는 프로세스가 빨라질 것이라고 생각합니다.
이 경우 어떤 방법이 더 빠르고 더 빠릅니까? 당신의 도움을 주셔서 감사합니다!

답변

2

더 빠를 때? 테이블에 추가하는 것은 레코드를 찾고 업데이트하는 것보다 빠르게 읽는 것이 더 빠를 것입니다. 읽기, 증가 및 업데이트하는 것보다 빠릅니다.

"precalulated"히트를 가졌지 만 계산할 집계 쿼리보다 빠릅니다.

로터리에서 잃어버린 스윙에서 얻게되는 선택 사항은 현재 사용 패턴에 따라 다릅니다. 따라서 히트 추가 속도를 늦추고, 얼마나 많은 사람들이 있었는지 알아 내려고합니다.

+0

@tony : 내 대답에 대해 설명해 주시겠습니까? 그것은 좋은 접근입니까? – beck03076

2

분명히 테이블에서 하나의 정수 열을 선택하는 것이 테이블에서 더 빠른 행 (count)을 선택하는 것입니다.

복잡성은 약간 부정적입니다. 더 복잡한 SQL을 작성해야하는 1 가지 방법, 다른 방법으로 코드에서 2 개의 테이블을 업데이트/삽입해야합니다.

조회수는 얼마나 자주 조회됩니까? 당신은 클라이언트가 그것을 보니, 또는 한 달에 한 번 확인합니까? 당신이 지금 만 보았다면 나는 카운트 (*)를 선택하는데 걸리는 시간에 대해 너무 걱정하지 않을 것입니다.

고객이 요청할 때마다 조회수를 조회하면 조회수 열을 저장합니다.

+0

예, 요청 당 요청 수가 확인됩니다 (API 키가 없으면 하루에 제한된 조회수가 발생 함). 그때 히트 곡에 여분의 필드를 사용하겠습니다. 감사. – Stefan

1

이제 테이블 구조가 모두 명확하게 정의되었으므로 작업 할 수 있습니다.

당신은 "인상"모든 고객을위한 테이블 "client_to_data"에 레코드를 삽입 모든 클라이언트는 다른 관점에서 데이터를 액세스 한 횟수 인 DB에 뭔가,

을 기록합니다. 당신은이 일에 대해 걱정

,

1. 중복
2.개수를 검색 할 때의 성능

카운트를 저장할 때의 성능은 어떻습니까? (삽입 문) ..?

이것은 memcache에 삽입 할 데이터를 쓰고 하루가 끝날 때 대량 삽입을 수행하는 전형적인 시나리오입니다.

더 중요한 것은 데이터를 DB에 삽입하기 전에 정규화 할 것입니다. 선택하려면 색인을 작성하십시오. 텍스트라면 스핑크스를 설치하십시오.

감사합니다.

+0

흥미로운 접근 방법, memcache를 한번 보겠습니다. – Stefan

+0

그리고 하루가 끝나기 전에 서버가 망가질 때 어떻게됩니까? 당신은 그 모든 통계를 잃는다 – tubaguy50035

+1

@ tubaguy50035 : 나는 그것을 고려하지 않았다! – beck03076