복붙노트

[SQL] mysql을 - 열 성능 대 만들기 행

SQL

mysql을 - 열 성능 대 만들기 행

나는 (raw_table를 호출 할 수 있습니다) PHP에서에 무리 통계 측정을 실행하고 난 다음 다른 테이블에 저장해야 할 것을 정확히 140 데이터 포인트와 함께 제공 내 데이터베이스에서 원시 데이터의 50 ~ 100 개 행을 끌어 웹 로그 분석 엔진을 내장 (results_table를 호출 할 수 있습니다). ( "- 1024"데이터 유형의 좋은 예 "40", "2.23") 이러한 데이터 포인트는 모두 매우 작은의 int입니다.

나는 MySQL은 매우 높은 (4000) 때문이다 최대 열 번호를 알고 있지만 성능이 정말 떨어지기 시작까지 때와 같이 회색 영역이 많이있을 나타납니다.

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

이 경우 더 적은 열이 양호하면 동일 'EXPERIMENT_ID'로 1), 데이터 포인트 (140)가 될 수있다, (7) 데이터 포인트의 모든 20 개의 행으로 나누어. 그러나이 난 항상이 140 열 1 개 행을 당겨보다 더 나은 성능있을 거라고 생각하지 않을 수 있도록 (7 열 각각 플러스, 아이디, 등으로) 모든 20 개 행을 끌어해야합니다. 질문 그래서 : 더 나은 (모든 필요를 한 번에 뽑아 될 것이다) 7-9 열 또는 140-143 열 1 행의 20 개 행을 저장하는 것입니다?

2) 내 데이터의 예 ( "40", "2.23"을 감안할 때 "- 1024"나는 구조 유형 SMALLINT를 생각하고) 저장됩니다 어떤 좋은 예입니다. 성능 현명하거나이 모든 의견?

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

귀하의 의견에 미리 감사드립니다.

해결법

  1. ==============================

    1.I (즉 정규화) 이상의 행으로 저장하는 변화의면에서 고려 설계 및 유지에 의존하여 이용을 생각한다.

    I (즉 정규화) 이상의 행으로 저장하는 변화의면에서 고려 설계 및 유지에 의존하여 이용을 생각한다.

    또한, 상기 열은 140과 동일한 의미를 갖는 경우, 또는이 실험마다 다르면 - 적절히 정규화 규칙에 따라 데이터를 모델링 - 즉 후보 키에 관련된 데이터 인 방법.

    모든 열을 사용하는 경우 지금까지 성능, 그것은 약간의 차이가 있습니다. 때로는 피벗 / UNPIVOT 작업은 많은 양의 데이터를 통해 비쌀 수 있지만, 하나의 키 액세스 패턴에 약간의 차이가 있습니다. 때때로 데이터베이스의 피벗 변화의 얼굴에 프론트 엔드 코드가 훨씬 간단하고 백엔드 코드를 더 유연 할 수 있습니다.

    당신이 널 (NULL)이 많은 경우, 표준화 된 설계의 행을 제거 할 수있을이 공간을 절약한다. MySQL은이 놀이로 올 수있는 스파 스 테이블 개념에 대한 지원이 있는지 모르겠어요.

  2. ==============================

    2.당신은 모든 시간을 반환하는 140 데이터 항목을 두 번 유형의 각이있다.

    당신은 모든 시간을 반환하는 140 데이터 항목을 두 번 유형의 각이있다.

    이 그것은 물론 하나 개의 모양을 위해 무한히 더 빠를하지만 다른 모양으로 처리 할 수있는 PHP 코드에서 여분의 복잡성을 고려 할 수 1x140 또는 20X7 또는 7x20 또는 4x35 등의 여부는 실질적인 차이가 없습니다.

    당신은 확인 된 병목 현상이 있거나이 무작위 조기 최적화는 있습니까?

  3. ==============================

    3.당신은 당신이 데이터베이스에 빅 데이터를 저장하고자한다는 제안을하지했지만,이 인수의 목적을 위해, 당신이 10 억 (10 ^ 9) 데이터 포인트가 있다고 가정합니다.

    당신은 당신이 데이터베이스에 빅 데이터를 저장하고자한다는 제안을하지했지만,이 인수의 목적을 위해, 당신이 10 억 (10 ^ 9) 데이터 포인트가 있다고 가정합니다.

    당신이 140 개 컬럼에 저장할 경우 실험을 많이에서 하나의 데이터 포인트를 검색하려는 경우, 당신은, 그러나, 불과 7 MILLON 행을해야합니다, 그것은 매우 넓은 많은 수의 행을 가져올 것입니다.

    이 매우 넓은 행은 따라서 당신이 너무 많은 캐시 할 수 없습니다, 당신의 innodb_buffer_pool에 더 많은 공간을 차지하게됩니다; 당신이 다시 액세스 할 때이 잠재적으로 당신을 늦출 것입니다.

    당신은 거의 열 (실험 ID, 데이터 포인트가 _ID, 값)와 함께 테이블에 행 당 하나의 데이터 포인트를 저장하는 경우에 당신은 작은 같은 수의 행을 꺼내해야합니다.

    그러나 행의 크기는 IO 작업의 수는 필요에 약간의 차이가 있습니다. 우리는 당신의 10 억 개 데이터 포인트 (요즘 안전한 가정하지 않는) 램에 맞지 않는다고 가정하면, 아마도 그 결과 성능은 거의 동일합니다.

    몇 가지 열을 사용하는 아마 더 나은 데이터베이스 디자인; 하지만 적은 디스크 공간을 사용하고 열을 많이 사용하는 경우 아마도 채울 빨라집니다.

  4. from https://stackoverflow.com/questions/4988915/mysql-creating-rows-vs-columns-performance by cc-by-sa and MIT license