2011-02-23 4 views
1

꽤 큰 MySQL 데이터베이스에 대한 일반적인 접근 방식과 관련된 질문이 있습니다. 데이터베이스와 상호 작용할 수있는 PHP 코드를 만들었습니다. 나는 엄청난 양의 데이터 (~ 130k 행, 200 열)를 분석하려고 시도하고 있으며 그렇게하기 위해 여러 가지 방법으로 놀고있다. 나는 그 길을 따라 많은 것을 배우고 있었고, 마치 내가 이 될 수 있도록 준비가되어있는 것처럼 느껴졌지 만 여전히 조금 붙어 있습니다.큰 MySQL 데이터베이스 조직에 접근하는 가장 좋은 방법은 무엇입니까?

나는 '엑셀'사고 방식으로 단단히 시작했습니다. 통계 분석을 위해 다양한 비트와 조각을 선택하려고 했으므로 계속해서 데이터 세트에 더 많은 열을 추가했습니다. 내가 만든 PHP/MySQL 스크립트 중 일부는 몇 시간이 걸렸습니다.

그런 다음 최소한 기본 작업으로 조인에 대해 배웠습니다. 이것은 내가 추측 한 약간의 계시 였지만, 결과적으로 조인이 제 데이터로 훌륭하게 재생되도록 모든 것을 다시 쓰게되었습니다. 최종 결과는 성능이 크게 향상되었습니다. 지금까지 약 15 초 정도 걸렸습니다.

몇 명의 사람들과 채팅을 한 후에, 나는 그것을 더 빨리 만들 수 있다고 결론을 내렸다. 내가 설정 한 방식은 다른 데이터 샘플이 각각 다른 테이블에 포함되도록하는 것이 었습니다. 각 테이블에는 조인의 일부로 사용 된 추가 테이블에 요약 된 데이터가 있습니다. 특정 데이터 세트에 대한 일반 정보는이 보조 테이블에 저장되어있어 액세스가 쉽고 속도가 빨라졌습니다.

지금 내가 가진 질문은 다음과 같습니다. 데이터베이스와 응용 프로그램의 작동 방식을 변경하여 이러한 다양한 데이터 샘플을 하나의 큰 테이블로 결합하는 것이 더 좋을까요? 지금까지 조금 실험 해 왔지만 현재 사용하고있는 방법보다 빠르지는 않습니다.

다른 말로하면 다중 테이블 조인과 관련된 단일 쿼리가 아닌 다중 테이블 조인을 포함한 많은 '작은'쿼리를 실행하는 것이 더 낫습니까? 나는 쿼리의 실행 시간을 검사 해왔고 조인이이 새로운 메서드에 대한 속도 저하를 유발하는 것처럼 보입니다.

PHP에서 MySQL로 반복적으로 작은 쿼리를 보내는 것이 단일 쿼리를 보내는 것보다 덜 바람직하다는 느낌을 받았지만, 그렇지 않은 경우 더 복잡한 쿼리를위한 전환점이 있습니까? 내가 그 시점에 도달 한 것처럼 보입니까?

+1

글쎄요, 사용하는 스토리지 엔진과 테이블 색인 방법에 따라 다릅니다. 방정식에는 두 가지 측면이 있습니다. 1. 사용중인 실제 스키마와 2. 발급 한 각 쿼리. 두 가지 모두 최적화 할 수 있습니다. – prodigitalson

+0

좋습니다. 알아두면 좋습니다. 이러한 다양한 데이터 샘플의 주된 문제점은 데이터를 정규화하는 쉬운 방법이 없다는 것입니다. 각 행이 완전히 고유하기 때문입니다.현재이 쿼리는 고유 한 행 ID (기본 키)와 SELECT 쿼리의 일부로 정기적으로 사용되는 3-4 개의 인덱스 열 집합으로 인덱싱됩니다. 그러나, 심지어 순간에 업데이 트가 시간이 오래 걸릴 것으로 보인다 - 대형 테이블 대신 속도를 개선하기 위해 대신 SELECT INTO를 사용하는 것이 좋습니다? – vize

답변

1

PHP에서 쿼리 최적화는 DB에서 최상의 성능을 얻는 방법이 아닙니다. 올바른 형식의 SQL 쿼리와 MySQL의 기본 제공 쿼리 최적화 프로그램을 사용하면 작업이 더 잘 수행 될 것입니다. 예를 들어, MySQL의 쿼리 최적화 프로그램은 http://en.wikipedia.org/wiki/Block_nested_loop과 같은 작업을 수행 할 수 있습니다.

그러나 실제 답변은 수행하려는 작업에 따라 다릅니다. 속도가 최우선 순위 인 경우 쿼리하려는 항목과 데이터 스키마를 나열하십시오. 답변에는 일반적으로 색인을 추가/삭제하고 검색어를 수정하는 것이 포함됩니다.

데이터베이스 공간을 작게 유지하는 것이 목표라면 (나는 싼 디스크 공간이 얼마나되는지 의심 스럽습니다.) 모든 것을 표준화하십시오.

+0

좋아, 이것은 알아두면 좋지만 현재는 약간 지저분하지만 일반적으로 다른 인덱스 된 열과 인덱스 된 열에 조인하는 것이 가장 좋은 경우입니까? – vize

+1

데이터의 하위 집합에만 관심이있는 거대한 테이블에서는 일반적으로 좋은 방법입니다. 그러나 그것 모두는 달갑지 않게 유감스럽게 생각합니다. 데이터베이스 최적화는 체스 게임과 같습니다. 예를 들어, 열에 대한 색인을 유지하는 것은 무료가 아닙니다. 삽입물을 수행하는 데 시간이 오래 걸립니다. 잠금 장치가 생길 수 있습니다. 그러나 때로는 뒤집어서 비용을 지불 할 가치가 있습니다. – Saurav

1

JOIN 쿼리가 올바르게 수행되었거나 인덱싱 된 경우 사용하는 것이 더 좋을 것이라고 생각합니다.

+0

아, 나는 다른 것보다 더 할 일을 알지 못한다고 생각했습니다. – vize

관련 문제