2009-12-03 3 views
1

이것은 웹 개발을위한 MySQL 질문입니다.MySQL : 중복 된 데이터 VS 더 많은 쿼리

현재 나 자신이 그것을 알아낼 수 없다, 나는 사용자 인증 시스템에 대한 데이터베이스 구조를 설계 그리고 난 하나 개의 질문 건너 온 :

은 더 나은 복제 한 데이터를 대신 더 만드는 쿼리?

id mediumint 
username varchar(15) 
password varchar(100) 
email varchar(80) 
status tinyint(1) <- is the user banned? 
language varchar(100) 
private_message_counter mediumint 
notify_email tinyint(1) 
Extra rows 

나는 것을 방지하기 위해 사용자의 테이블에 모든 "가장 많이 사용되는"행을 넣어 노력하고있어 여기에

현재 나의 사용자 테이블이 (의사 코드) 같은 것을 보이는, 약간의 배경이다 예를 들어, 더 질의 :

With Indicator on users table: 
- 
User Logged on? (query Sessions) 
Get User Data (query Users) 
Get User Permissions (query permissions) 
- 

Without indicators: 
- 
User Logged on? (query Sessions) 
Is the user Banned? (query Bans) 
Get User Data (query Users) 
Get User Permissions (query Permissions) 
Get Private Message information (query private_messages table) 

하나의 작은 "문제는"사용자 테이블 행의 많은 끝나는 것입니다. 또한 데이터 불일치를 방지하기 위해 더 많은 검사를해야하지만 개선 방법이 좋지 않다는 것이 확실합니다.

참고 : 내 웹 사이트에는 약 14,500 명의 동시 사용자가 연결되어 있습니다. 그래서 나는 그것을 향상시킬 것인지 또는 완전한 반대를 할 것인지를 알아야합니다.

의견이나 제안을 환영합니다.

+0

세션에서 데이터를 캐싱하여 쿼리 최소화를 고려 했습니까? 사용자가 금지되어야한다고하더라도 세션이 끝날 때까지만 활성화됩니다. –

+0

금지 조치를 취하면 최근 사용자의 모든 세션을 파괴하여 즉시 로그 아웃 할 수 있습니다. –

답변

1

영리한 UNION 문을 사용하지 못한다는 실제 성능 문제가 있습니까?

단기간의 성능을 얻기 위해 테이블을 과부하하지 않겠습니다. 테이블이 커질수록 가동 시간이 희생됩니다 (나에게 일어난 일). 애플리케이션에 여러 계층의 캐싱이 필요할 수 있습니다. (세션 + 사용 권한에 대한 금지 상태 및 구체화 된보기에 대한 memcached의 일부 조합 일 수도 있습니다.)

테스트를 실행하여 테이블에있는 데이터의 행 수를 크기 조정 한 후 결과가 어떻게되는지 확인하고 100,000 명의 동시 사용자. 현재 및 자주 사용자와 덜 빈번한 사용자간에 테이블을 분할하여 아키텍처에 도움이 될 수 있습니다. 또는 세션을 처리하는 서버와 표준 데이터를 처리하는 서버를 따르십시오.

내 프로젝트에서 내 사용자의 약 0.01 % 만 한 번에 로그인합니다. 사용자의 1 %가 로그인 한 경우 백만 행 범위로 확장됩니다. 가동 시간 요구 사항 및 기본 성능 요구 사항을 유지하는 방법을 고려해 보시기 바랍니다. 테이블 복구, 최적화, 백업 : 이러한 작업은 저렴하지 않으며 다중 마스터 아키텍처에서 까다로울 수 있습니다. (테이블 파티셔닝에 대한 생각)

작은 테이블에서 수행 할 때 업데이트 및 복구 작업이 저렴합니다. mysql 쿼리 캐시에서 캐시 된 쿼리의 큰 그룹을 삭제할 가능성이 낮을뿐 아니라 더 나은 키 캐시 성능을 유지합니다.사용자 테이블이 자주 업데이트되는 경우 자주 업데이트되지 않는 열과 자주 업데이트되는 열을 구분해야합니다. 키 캐시 적중률이 향상되고 쿼리 캐시 적중률도 높아집니다.

실제로이 응용 프로그램을 확장하려는 계획이있는 경우 매일 더 많은 쿼리를 처리해야합니다. 쿼리 속도가 단지 두 배가 될 때 응용 프로그램에 문제가 발생하면 문제가 발생합니다. 필자의 경험에 따르면, 데이터를 사용자 테이블에 복제하면 (데이터 모델에 대한 기본 사항) 다른 데이터 테이블을 사용하기가 더 힘들어지며,이를 피하기가 어려울 수 있습니다.

2

매우 매우 매우은 정답 데이터 복제입니다. 우리는 종종 normalization에 대해 이야기합니다.

일반적으로 10 억 개의 행을 처리하는 오프라인 데이터웨어 하우스 상황에서만 데이터를 복제하므로 집계 처리 시간이 너무 길어집니다. 데이터가 동기화되지 않을 위험에 처한 온라인 시스템에서 데이터를 복제함으로써 얻게되는 이익은 거의 항상 커집니다. 몇 가지 추가 질의가 당신을 죽이지는 않을 것입니다.

+0

내가 말하는 온라인 서비스는 거대한 "종류"입니다. 14,500 명의 동시 사용자가 로그인했습니다. Â 추가 쿼리를 만드는 부담이 장기적으로 큰 고통으로 변하지는 않습니까? – MarioRicalde

+1

데이터베이스가 올바르게 스펙되고 예상로드에 맞게 설정되지 않은 경우. 스키마를 위반하여로드를 관리하려는 경우 말하기가 싫지만 잘못하고 있습니다. – Donnie

+0

네, 그래요. 이 문제를 처리하기 위해로드 균형 조정과 여러 서버가 있어야합니다. 권리? – MarioRicalde

관련 문제