2010-01-12 6 views
9

2 권의 응용 프로그램 (책 및 리더)이있는 프로젝트가 있습니다.수백만 개의 행이있는 장고 테이블

책 응용 프로그램이이 필드 행 4 milions있는 테이블이 있습니다 방지하기 위해

book_title = models.CharField(max_length=40) 
book_description = models.CharField(max_length=400) 

행의 4 milions으로 데이터베이스를 조회하기를, 나는 20 (대상 20 개 모델을 나눌 생각하고 .

reader_name = models.CharField(max_length=20, blank=True) 
book_subject = models.IntegerField() 
book_id = models.IntegerField() 

그래서 대신 Foreig : 200.000 행 (book_horror, book_drammatic, ECC) "독자"에서

있는 테이블은 응용 프로그램,이 필드를 삽입 할 생각입니다 nKey, 정수 "book_subject"(해당 테이블에 액세스 할 수 있음) 및 "book_id"("book_subject"에 지정된 테이블에 액세스 할 수 있음)를 사용하려고합니다.

4 백만 개의 행이있는 테이블을 쿼리하지 않으려면 좋은 해결책입니까?

대체 솔루션이 있습니까?

감사합니다^__^

+8

4 백만 명이 많지 않으므로 조숙 한 최적화 사례가 있습니다. – Tobu

+0

표는 views.py에서이 쿼리 자동 완성 필드를 사용하여 아약스에서 쿼리 : books.objects.filter (book_title__istartswith = request.GET [ 'Q']) [100] – xRobot

+0

쿼리하는 경우 테이블을 텍스트 필드와 성능에 문제가있는 경우 전체 텍스트 검색을 구현하도록 선택할 수 있습니다. 그러나 쿼리 한 필드의 크기는 40 자 뿐이며 db에 큰 문제가 있는지 확실하지 않습니다. – shanyu

답변

12

많은 사람들이 말했듯이, 테이블을 작은 테이블 (수평 분할 또는 샤딩)으로 분할하는 것은 시기상조입니다. 데이터베이스는이 크기의 테이블을 처리하도록 만들어 졌으므로 성능 문제가 다른 곳에서 발생했을 수 있습니다.

인덱스가 첫 번째 단계이지만,이 작업을 수행 한 것처럼 들립니다. db가 인덱스로 처리하려면 4 백만 행이 좋습니다.

두 번째로, 실행중인 쿼리 수를 확인하십시오. 장고 디버그 도구 모음과 같은 방법으로이 작업을 수행 할 수 있으며 불필요한 쿼리가 얼마나 많이 생성되는지 놀라게됩니다.

캐싱은 다음 단계로, 대부분의 사용자에게 변경되지 않은 페이지 또는 페이지 부분에는 memcached를 사용하십시오. 여기서 필요한 작은 노력으로 가장 큰 성능 향상을 볼 수 있습니다.

테이블을 분할해야하는 경우 최신 버전의 django (1.2 alpha)는 샤딩 (예 : multi-db)을 처리 할 수 ​​있으며 수평 분할 솔루션을 작성할 수 있어야합니다 (postgres offers 이 작업을 수행하는 in-db 방식). 장르를 사용하여 테이블을 분할하지 마십시오! 언제 까지나 변함없이 변하지 않는 것을 선택하십시오. 쿼리를 작성할 때 항상 알게 될 것입니다. 저자와 마찬가지로 성 등의 첫 글자로 나눕니다. 이것은 많은 노력을 필요로하며 특히 큰 데이터베이스가 아닌 여러 가지 단점을 가지고 있습니다 --- 이것이 대부분의 사람들이 여기에 대해 조언하는 이유입니다!

[편집]

나는 탈분 표준화를 버렸다! 일반 쿼리에 대한 조인을 방지하기 위해 공통 개수, 합계 등을 예를 들어 작성자 테이블에 넣습니다. 단점은 장고가 DenormalizedField를 추가 할 때까지 스스로 유지해야한다는 것입니다. 분명히 명확한 케이스를 위해 또는 캐싱이 실패한 후에 개발 중에 이것을 보게 될 것입니다.하지만 샤프닝이나 수평 분할 전에는입니다.

+0

, 나는 views.py에서이 쿼리 자동 완성 필드를 사용하여 참으로 더 합리적 :) 표는 아약스에서 쿼리 ... 첫 글자하여 분할합니다 : 책을 .objects.filter (book_title__istartswith = request.GET [ 'q']) [: 100] 그래서 index + memcached를 권하고 싶습니다. 감사합니다. – xRobot

+0

주먹에 3 글자 (또는 데이터베이스를 쿼리하기 시작하는 첫 번째 숫자)의 인덱스를 만드십시오. 그러면 매우 빠르게 실행됩니다. – naivists

10

ForeignKey은 데이터베이스에 IntegerField로 구현됩니다, 그래서 당신은 당신의 모델을 마비의 비용 아무것도 작은 저장합니다.

편집 : 피트를 위해 하나의 테이블에 보관하고 적절한 인덱스를 사용하십시오.

+0

색인을 사용하고 있지만 표에 4 개가 있습니다. 수백만 개의 행이 있으며 자주 질의됩니다. 따라서 인덱스가 충분한 지 알 수 없습니다. - \ – xRobot

+0

그렇지 않으면 데이터베이스에 더 많은 메모리가 필요합니다. –

+2

4 백만 행을 재채기 할 필요는 없지만, 특히 인덱싱을 수행하는 경우 이러한 종류의 작업을 위해 데이터베이스가 구축됩니다.당신이 적어도 1 억 행을 넘는다면 나는 그것에 대해서만 걱정할 것입니다. – LeafStorm

0

저는 장고에 익숙하지 않지만 DB에 대해 전반적으로 이해하고 있습니다.

대용량 데이터베이스를 사용하는 경우에는 index your database에서 정상입니다. 그렇게하면 데이터를 검색하는 것이 훨씬 빨라집니다.

독자와 책을 연결하려면 독자와 책을 연결하는 다른 테이블을 만들어야합니다.

책을 주제로 나누는 것은 나쁜 생각이 아닙니다. 하지만 20 가지 응용 프로그램을 통해 무엇을 의미하는지 확신 할 수 없습니다.

+0

20 개의 응용 프로그램은 20 개의 테이블을 의미합니다. \t 이미 색인을 사용하고 있지만 테이블에 4 백만 개의 행이 있으며 자주 질의됩니다. 그래서 색인이 충분한 지 나는 모른다 : - \ – xRobot

+1

신들이 없다! 20 개의 테이블로 나누지 마십시오! 테이블에 대한 EAR 다이어그램을 작성하면이를 처리하는 데 필요한 추가 테이블을 볼 수 있습니다. 예 : 사람을 책에, 카테고리를 책 등에 연관시키기위한 여분의 테이블. – Steven

0

성능에 문제가 있습니까? 그렇다면 add a few indexes해야 할 수도 있습니다.

인덱스가 도움이되는 아이디어를 얻는 한 가지 방법은 DB 서버의 쿼리 로그 (MySQL의 경우 instructions here)를 보는 것입니다.

성능에 문제가 없다면 그냥 사용해보십시오. 데이터베이스는 수백만 개의 레코드를 처리하도록 만들어졌으며 django는 합리적인 쿼리를 생성하는 데 꽤 능숙합니다.

+0

예, 성능 문제입니다. 인덱스를 사용하고 있지만 테이블에 4 백만 개의 행이 있으며 쿼리가 자주 발생합니다. 그래서 색인이 충분한 지 모르겠다. - \ – xRobot

+0

더 큰 색인 (더 많은 열)이 아마도 @jcm 멘션으로 memcached에 추가 될 가능성이있다. 종종 단일 열 인덱스는 쿼리에서 사용되지 않기 때문에 도움이되지 않습니다. 나는 테이블을 분할 할 경우 확인 – Seth

0

이 유형의 문제에 대한 일반적인 접근 방법은 Sharding입니다. 불행히도 대부분의 경우 ORM을 구현하여 (Hibernate는 훌륭하게) Django는 이것을 지원하지 않습니다. 그러나 4 백만 행이 실제로 그렇게 나쁘지는 않습니다. 검색어는 여전히 완전히 관리 할 수 ​​있어야합니다.

어쩌면 memcached과 같은 것으로 캐싱해야합니다. Django supports this 꽤 좋습니다.

1

사용중인 데이터베이스에 대해 언급하지 않았습니다. MySQL 및 PostgreSQL과 같은 일부 데이터베이스는 기본적으로 매우 보수적 인 설정을 가지고 있으며 기본적으로 작은 서버의 작은 데이터베이스를 제외하고는 사용할 수 없습니다.

사용중인 데이터베이스와 실행중인 하드웨어, 해당 하드웨어가 다른 애플리케이션과 공유되는지 (예 : 웹 애플리케이션도 제공하는지)를 알려주는 경우 Google은 다음을 제공 할 수 있습니다. 몇 가지 구체적인 조정 조언.

예를 들어 MySQL에서는 InnoDB 설정을 조정해야 할 수 있습니다. PostgreSQL의 경우 shared_buffers 및 기타 여러 설정을 변경해야합니다.

관련 문제