2013-03-16 2 views
0

소셜 네트워크 웹 사이트에서 작업 중이므로 사용자가 많이되기를 바랍니다. 모든 사용자에 대해 태그 (키 | 카운터)를 저장해야하며 1) 큰 테이블 대 2) 1 개의 큰 테이블 대 3) 큰 테이블을 분할하는 것이 더 나은지 궁금합니다.mysql 성능 하나의 큰 테이블 대 많은 테이블

1)이 많은 테이블을 구현 한 예입니다

테이블 userid_tags (모든 사용자가

key | counter 
----- --------- 
tag1 | 3 
tag2 | 1 
tag3 | 10 

Query 1: SELECT * FROM userid_tags WHERE key='tag1' 
Query 2: SELECT * FROM userid_tags 

2) 단일 테이블 구현) 자신의 테이블의있다 :

표 태그

01 23,516,
key | counter | user_id 
----- ------------------ 
tag1 | 3  | 20022 
tag2 | 1  | 20022 
tag2 | 10 | 31234 

Query 1: SELECT * FROM userid_tags WHERE key='tag1' AND user_id='20022' 
Query 2: SELECT * FROM userid_tags AND user_id='20022' 

3) 스플릿 테이블 구현

테이블 1000_tags (USER_ID 1 내지 1000)

key | counter | user_id 
----- ------------------ 
tag1 | 3  | 122 
tag2 | 1  | 122 
tag2 | 10 | 734 

테이블 (USER_ID 20000)에서 21,000에

key | counter | user_id 
----- ------------------ 
tag1 | 3  | 20022 
tag2 | 1  | 20022 
tag2 | 10 | 20234 

Query 1: SELECT * FROM userid_tags WHERE key='tag1' AND user_id='20022' 
Query 2: SELECT * FROM userid_tags AND user_id='20022' 
을 21000_tags

3) 에 대한 질문 좋은 분할 인덱스가 무엇입니까? 나는 instict 다음 1000 (사용자)를 사용했습니다

+0

정규화 시점에서 볼 때 두 번째 요소 만 실제로 의미가 있습니다. 성능 POV에서 ... 음 ... 당신의 테스트는 뭐래? : P 만약 당신이 대답 할 수 없다면, 당신은 * 이것에 대해 "최적화"에 대해 * 생각할 준비조차되지 않았습니다. – cHao

+1

디자인 수준에서 이러한 유형의 파티셔닝을 수행하지 마십시오. 기껏해야 반 패턴입니다. 코드 복잡성이 증가하고 성능이 저하됩니다. DB 엔진이 그 일을하도록하십시오. –

+0

@cHao 아직 테스트를 수행하지 않았지만 구현하기 전에 다른 개발자의 의견을 알고 싶습니다. 빠른 작업이 아닙니다. – Mike

답변

2

옵션 2를 사용하는 것이 올바른 방법입니다. 하지만 여전히 테이블 내에서 파티션을 사용할 수 있습니다. 파티션 사용에 대한 모든 정보는 MySQL documentation에서 찾을 수 있습니다.

분할마다 천 사용자를위한 파티션의 테이블은 같이 보일 것입니다 :

CREATE TABLE tags (`key VARCHAR(50), counter INT, user_id INT) 
    PARTITION BY KEY(user_id) partitions 1000; 

user_id는 21001이 될 것입니다 경우 같은 올바른 파티션 뭔가 검색을 시작할 수 :

SELECT * FROM tags PARTITION (p22);' 

때문에 id 21001은 22 번째 파티션에 있습니다. 자세한 정보는 링크를 확인하십시오.

+0

나는 그것이 중요한 상황에서 본 적이 없기 때문에 내가 이것을 추천 할 수 있는지 확신 할 수 없다. 그럼에도 불구하고 재미있는 정보입니다. :) +1 – cHao

3

2 정답입니다. 사용자 당 하나의 테이블 또는 1000 개의 태그 당 1 개의 테이블을 어떻게 유지할 것인지 생각하십시오. 어떻게 테이블을 생성/업데이트/삭제 하시겠습니까? 만약 당신이 대량 변경해야합니까? 당신은 어느 테이블을 선택할 수 있어야합니까? 가능한 경우에도 두 개 이상의 표에서 동시에 선택해야하는 경우 (예 : 두 명의 사용자에 대해 태그를 가져옴)

테이블을 분할하면 성능상의 이익이 크게 줄어들지 않습니다. 테이블이 커지면 mysql이 키를 생성해야하기 때문에 삽입이 느려질 수 있지만 적절한 키를 찾으면 매우 빨라야합니다.

또 다른 비슷한 해결책으로는 태그 용 테이블, 사용자 용 테이블 및이 둘을 매핑하는 테이블이 있습니다. 이렇게하면 태그 카디널리티가 작아지며 두 테이블 모두에 대해 auto_increment 대리 키를 사용하는 경우 두 키 길이가 작아 관계에 대한 제한없이 가능한 빨리 조회해야합니다 (예 : 다른 사용자가 참여할 다른 테이블).

관련 문제