2012-05-24 2 views
0

웹 응용 프로그램을 만들고 데이터베이스 백엔드로 MySQL을 사용하고 있습니다. 내 DB는 결국 일부 테이블에서 1 억 개가 넘는 행처럼 더 커질 것입니다. 그런 큰 테이블에 대해 한 가지만 확인하고 싶었습니다.MySQL 성능

Opt 1. 테이블에 기본 키가 있고 기본 키를 사용하여 쿼리를 작성한다고 가정 해 보겠습니다.하지만 각 사용자 로그인에 대해 100 개의 쿼리를 사용하여 mysql 쿼리를 실행해야합니다.

USERID KEYS 

1  {1,2,3,4} 

난 사용자의 키를 가져온 다음에 사용자가 로그인, 내가 예를 들어 자신의 북마크 된 사이트를 얻을 필요가있는 경우 각 값을

PRI.KEY Value 

1  google 

2  yahoo 

3  aol 

4  windows 

를 얻기 위해 기본 키 쿼리를 만들 것입니다. 그래서 두 개의 쿼리를 만들 것입니다 TB_KEYS에서 KEYS를 선택하십시오. 여기서 USERID = 1; 그런 다음 KEYS와 각 키를 구문 분석합니다. TB_VALUES에서 값을 선택하십시오. 여기서 PRI.KEY = (첫 번째 쿼리에서 파싱 한 KEY - i).

옵션 2. 기본 키를 사용하여 쿼리를 작성하지 않지만 사용자 로그인을 위해 쿼리를 거의 실행하지 않아도됩니다.

OPT_TABLE_2

USERID KEY   Value 

1  1   google 

1  2   yahoo 

1  3   aol 

1  4   windows 
OPT_TABLE_2에서

선택 값 여기서 USERID = 1;

어느 옵션이 더 좋을까요 ..?

+0

귀하의 질문에 약간의 의미가 있습니다.당신이 얻으려고하는 일종의 실제 SQL 쿼리를 포함 할 수 있습니까? – Cylindric

+0

사용자가 로그인하면 예를 들어 자신의 북마크 된 사이트를 가져와야합니다. 그래서 첫 번째 접근 방식에서 두 가지 쿼리를 만들 것입니다 : TB_KEYS에서 KEYS를 선택하십시오. 여기서 USERID = 1; 그러면 KEYS와 각 키를 구문 분석합니다. TB_VALUES에서 값을 선택하십시오. 여기서 PRI.KEY = (첫 번째 쿼리에서 파싱 한 KEY - i). –

+0

질문을 수정하여 의견을 업데이트로 게시하지 마십시오 :) 멋진 형식을 얻고 미래의 독자는 단서를 찾기 위해 모든 의견을 검색 할 필요가 없습니다. 왜 JOIN을 사용할 수 없는지 확실하지 않습니다. – Cylindric

답변

0

그러나 나는 각 사용자 로그인마다 100 개의 검색어를 사용하여 mysql 쿼리를 실행해야합니다.

그런 이유로이 접근법은 잘못되었습니다. relational database normalisation rules을 적용하지 않았습니다.

하지만 난 사용자의 로그인

에 대한 몇 가지 쿼리를 실행해야합니다 그럼 그것은 여전히 ​​아마 잘못. 이 구조에서 사용자와 관련된 데이터를 가져 오려면 하나의 쿼리 만 실행하면됩니다. 제안 된 구조로 표시되지 않은 정보를 얻으려는 경우입니다.

쿼리 수를 줄이면 이 대용량이됩니다.은 성능에 영향을줍니다.

직접 테스트하는 것은 간단합니다.

0

관계형 데이터베이스를 사용하면 아마도 첫 번째 것입니다. 적절한 인덱싱을 사용하면 두 번째 필터를 통해 필터를 수행하는 것이 매우 빠르지 만 처음에는 훨씬 작은 테이블이 있어야 일반적으로 더 좋습니다.

사용자, 사용자 키 쌍 및 키의 세 가지 테이블이 실제로있는 것이 좋습니다.

많은 쿼리를 실행하는 경우 실제로 이유를 파악하고 실행 횟수를 줄이는 것이 좋습니다.

중요한 성능 질문과 마찬가지로 : 벤치마킹. 10K 테스트 사용자와 해당 데이터를 생성하고 각 방법으로 실행할 때 어떤 일이 발생하는지 확인하십시오.

+0

익명 downvote 왜? – zebediah49

+0

다른 곳에서 답을 참조하십시오 - opt 1은 nrormalisation의 첫 번째 규칙을 어기고 추가 쿼리를 생성하기 위해 데이터를 구문 분석해야하며 쿼리 처리 오버 헤드 인 DBMS의 테이블을 조인 할 방법이 없습니다. – symcbean

+0

정말요? 나는 하나의 깨끗한 단계에서 문자열의 인덱스 목록을 선택하는 방법이 있다고 맹세한다. 그렇기 때문에 두 번째 선택이 세 번째 테이블을 사용하여 연결하는 것입니다. – zebediah49