2009-08-15 4 views
4

Ive는 수천 개의 제품과 50 명 정도의 인증 된 사용자의 테이블을 가지고 있습니다.각 사용자별로 목록별로 정렬 된 Mysql 결과

이 사용자는 모두 자신의 웹 사이트에 제품을 표시하며 모두 사용자가 다르게 주문할 수 있어야합니다.

내가 짐작할 때 product_id, user_id 및 주문 열이 포함 된 주문에 대해 별도의 테이블이 필요하다고 생각하십니까?

어떻게하면 데이터베이스에서 수백만 가지의 제품을 얻을 수 있는지 매우 빠르고 효율적으로 MySQL에서 가장 효율적으로 수행 할 수 있습니다.

mysql에서 수행하는 것이 현명한가? 아니면 solr/lucene과 같은 다른 인덱스를 사용해야합니까?

내 제품 테이블은

내가 필요한 기능의 좋은 예는/주문 당신이 로그인 한 경우 결과를 supress 수 있습니다 구글 검색은 "제품" 내 사용자 테이블이라고합니다 "사용자"라고합니다.

편집 : 제품의 결과가 매겨진되고 사용자는 제품을 편집 할 수있는 권한을 가지고 그 단지 준비가되어 있지 그렇게 만

답변

1

글쎄, 먼저 페이지에 수천 개를 표시하고 수백만 개의 제품을 표시한다면 느려질 것입니다. 나는 당신이 어떻게 든 그들을 페이지 당 정상 숫자로 필터링한다고 가정합니다.

어쨌든 product_order 테이블에 대한 조인은 매우 빠릅니다. 기본 키와 상수 (사용자 ID) 모두 정수이며, 빠른 인덱스 조회가됩니다. 내가 볼 수있는 몇 가지 문제가 있습니다. 첫째, 각 사용자가 실제로 백만 가지 제품의 주문을 정의 할 예정입니까?

SELECT whatever 
    FROM 
    products p 
    LEFT JOIN products_order o ON (
     p.product_id = o.product_id 
     AND 1234 = o.user_id 
    ) 
    WHERE p.stock > 0 -- some search criteria 
    ORDER BY COALESCE(o.order, 999999999) --- arbitrarily large number 
    LIMIT 10 

ORDER BYLIMIT 전에 발생합니다 마지막에는 순서 = 디스플레이 없다는 가정하에, 또 다른 문제가있다. MySQL은 행을 합친 다음 거대한 조인 (hello filesort)을 정렬해야합니다. 그런 다음 1,000,000 개의 행 중 999,990 개를 버립니다.

각 사용자가 몇 가지 제품만을 판매한다는 것이 밝혀지면이 문제는 발생하지 않습니다. where 절은 MySQL이 일부 행을 조인하고 정렬하도록합니다. 각 사람이 수백만 달러를 팔면 아마도 일부 비정규 화를해야 할 것입니다. 따라서 products_order에서 모든 필터링을 수행 할 수 있으며 엄청난 수의 행을 피할 수 있습니다. products_order에 행이 많이 필요할 것입니다. 각 (제품, 사용자) 조합마다 하나씩 ... 불행히도 어느 쪽이든 통증이 있습니다.

+0

답변 해 주셔서 감사합니다. 죄송합니다. 결과가 페이지 매김 될 것입니다 (최대 50 개). 각 사용자는 처음 20-50 개 제품 만 주문하고 나머지는 염려하지 않으실 것입니다. – ADAM

+0

좋습니다.이 경우,이 방법은 확장됩니다. FROM을 내가 보여준 것과 반대 순서로 수행하십시오 (products_order o 제품 p에 ...). 그러면 사용자가 주문을 입력 한 <50 행을 넘지 않습니다. – derobert

0

당신이해야 항상 인덱스/주문/그룹이 향상하는 곳에서 발생 colums 성능. 그러나 귀하의 경우에는 레이어 구조에 따라 달라 지지만 고객이 데이터베이스에 어떻게 액세스합니까?

쿼리를 실행할 수 있도록 MySQL 데이터베이스에 직접 연결 하시겠습니까?

아니면 웹 서비스 등을 통해 액세스합니까?

어느 쪽이든 고객이 주문 성명을 변경하여 고객의 생산성을 높일 수 있도록 데이터 계층을 조정할 것입니다.

+0

나는 당신이 OP가 원하는 것을 오해했다고 생각합니다. 그는 임의의 "주문"조항이 아닌 제품의 맞춤 주문을 원합니다. 각 사용자는 "이 제품을 먼저 넣으십시오."라고 말할 수 있어야합니다. - "가격 목록별로 제품 목록을 나에게 줄뿐 아니라." – derobert

+0

음, 아직도 대답은 색인 질문입니다.) –

0

각 사용자 옵션을 저장할 테이블을 사용할 수 없습니까? "색인 로봇"시스템이 있습니까? 이렇게하면 SQL 쿼리가 훨씬 빨라집니다. 그리고 왜 사용자가 처음 25 명에 대해서만 신경을 쓰면 100,000 행을 반환해야합니까?

+0

그들은 판매를위한 그들의 제품이기 때문에 첫번째 20-50에 관하여 염려한다, 그러나 판매를위한 다른 제품에서 (아직도 다량 아닙니다) 그러므로 아직도 우선 순위를내는 돈을 번다. 그것들은 모두 같은 테이블에 나열되어 있어야하며, 필요한 경우 사용자가 다른 속성 (가격, 날짜, 제목 등)으로 검색하고 정렬 할 수 있어야합니다. 이런 이유로 나는 theres가 SQL/normilisation보다 나은 해결책이라고 생각한다. – ADAM

관련 문제