2011-02-14 4 views
5

데이터베이스에서 원시 데이터 50-100 행을 가져와 (raw_table이라고 할 수 있음) 분석 엔진을 구축하고 PHP에서 통계적 측정을 수행 한 다음 정확하게 나타납니다 140 개의 데이터 포인트를 다른 테이블에 저장해야합니다 (results_table). 이 데이터 포인트는 모두 매우 작은 int ("40", "2.23", "- 1024"는 데이터 유형의 좋은 예입니다)입니다.mysql - 행과 열 성능 만들기

mysql의 최대 열 수는 4000+로 매우 높지만 실제로 성능이 저하되기 시작한 경우에는 많은 회색 영역이있는 것으로 알고 있습니다. 여기

그래서 몇 가지 질문에 최상의 성능 관행에 :

한이 같은 'experiment_id'적은 열 경우 7 데이터 포인트 모두 20 행으로 나누어, 더 나은 경우) (140 개), 데이터 포인트가 될 수있다 더 나은. 그러나 필자는 140 열의 1 행을 가져 오는 것보다 성능이 좋을 것이라고 생각하지 않기 위해 항상 20 열 (각각 7 열, ID 등)을 가져와야합니다. 질문 : 7-9 열 20 행 (한꺼번에 모두 가져와야 함) 또는 140-143 열 1 행을 저장하는 것이 더 좋습니다.

2) 내 데이터 예제 ("40", "2.23", "- 1024"는 저장 될 내용의 좋은 예입니다.) 구조 유형에 대해 smallint을 생각하고 있습니다. 실적에 따라 또는 그 밖의 의견이 있으면 언제든지 알려주십시오.

3) MySQL 성능 문제 또는 팁에 대한 다른 의견은 환영합니다.

미리 감사드립니다.

+2

'int'와'int (1)'의 크기가 같으므로 저장하는 데 사용하는 바이트 수가 동일해야합니다 (길이가 '제로 패딩'이 설정된 경우에만 문제가 있음). 또한 숫자가 음수가 될 수 없다면'unsigned '를 사용할 수 있습니다. 또한'int '타입에는 부동 소수점 숫자 (예 :'2.23')를 저장할 수 없습니다. –

+0

'double'은 다음입니다. :), thanks. 열의 모든 입력 질문에 질문이 있습니까? – themerlinproject

답변

4

더 많은 행 (즉, 정규화 된)으로 저장하는 이점은 변화에 직면 한 설계 및 유지 관리 고려 사항에 달려 있다고 생각합니다.

또한 140 열이 동일한 의미를 가지거나 실험마다 다를 경우 정규화 규칙에 따라 데이터를 적절히 모델링합니다. 즉, 후보 키와 관련된 데이터는 어떻게 표시됩니까?

성능면에서 모든 열을 사용하면 거의 차이가 없습니다. 때로는 피벗/피벗 해제 작업이 많은 양의 데이터에 비해 비용이 많이 들지만 단일 키 액세스 패턴에는 별다른 차이가 없습니다. 때로는 데이터베이스의 피벗 (pivot)이 프론트 엔드 코드를 훨씬 간단하고 백엔드 코드가 변경되는 상황에서 더욱 유연하게 만들 수 있습니다.

NULL이 많으면 정규화 된 디자인에서 행을 제거 할 수 있으며 공간을 절약 할 수 있습니다. MySQL이 스파 스 테이블 개념을 지원하는지 여부는 알지 못합니다.

+0

응답 해 주셔서 감사합니다. 나는 20x7과 함께 가기로 결심했다. 앞으로의 유연성을 좀 더 높여 줄 것이다. NULL이 없습니다. – themerlinproject

3

귀하는 매일 두 번씩 반환 할 140 개의 데이터 항목이 있습니다. 이 1x140 또는 20X7 또는 7x20 또는 4x35 등 그것은 물론 하나 개의 모양을 위해 무한히 더 빠를 수 있지만, 당신은 다른 처리하는 PHP 코드에서 여분의 복잡성을 고려한인지

그것은 더 실제 차이가 없습니다 모양.

병목 현상이 확인 되었습니까, 아니면 그냥 너무 조숙 한 최적화입니까?

+1

응답 해 주셔서 감사합니다. 나는 20x7과 함께 가기로 결심했다. 앞으로의 유연성을 좀 더 높여 줄 것이다. "조숙 한 최적화"라는 용어를 "주의 깊은 계획"이라고합니다.) – themerlinproject

3

큰 데이터를 데이터베이스에 저장할 것을 제안하지 않았지만이 인수의 목적으로 10 억 (10^9) 데이터 포인트가 있다고 가정합니다.

140 개의 열에 저장하면 행이 7 밀론에 불과하지만 많은 실험에서 단일 데이터 요소를 검색하려면 매우 많은 수의 데이터를 가져와야합니다 행.

이 매우 넓은 행은 innodb_buffer_pool에서 더 많은 공간을 차지하므로 많은 수의 캐시를 처리 할 수 ​​없습니다. 이 기능을 사용하면 다시 액세스 할 때 속도가 느려질 수 있습니다.

행 당 하나의 데이터 포인트를 저장하는 경우 매우 적은 수의 열 (experiment_id, datapoint_id, value)이있는 테이블에서 동일한 수의 작은 행을 가져와야합니다.

그러나 행의 크기는 필요한 IO 작업의 수와 거의 차이가 없습니다. 10 억 데이터 포인트가 램에 맞지 않는다고 가정하면 (현재 안전한 가정은 아님) 결과 성능은 거의 동일합니다.

소수의 컬럼을 사용하는 것이 더 나은 데이터베이스 디자인 일 것입니다. 많은 열을 사용하는 경우 디스크 공간을 덜 차지하며 더 빨리 채울 수 있습니다.