2012-12-19 2 views
1

내 웹 사이트는 많은 양의 태그가 지정되고 분류 된 콘텐츠를 제공하며 사용자의 요구에 따라 콘텐츠를 정렬하는 강력한 알고리즘을 만들려고합니다. 사용자는 가장 관심이있는 태그를 선택할 수 있으며 해당 태그와 일치하는 컨텐츠에 우선 순위가 부여됩니다. 또한 콘텐츠를 "좋아"(우선 순위를 높임) 할 수 있으며 시간 감퇴로 우선 순위를 낮 춥니 다. 궁극적으로 사용자는 관심있는 내용과 일치하는 비교적 새로운 콘텐츠를보아야하며 다른 사용자에게도 인기가 있습니다.매우 큰 MySQL 테이블에서 데이터를 가져 오는 알고리즘 최적화

현재의 알고리즘은 다음과 같이 작동 content 테이블에서

  1. 풀 모든 항목. 각 항목에 1 점을 지정하십시오.
  2. 을 확인하여 1 단계에서 가져온 배열에 일치하는 항목이 있는지 확인하십시오.
  3. 각 항목이 얼마나 좋아하는지 보려면 content_likes을 확인하십시오. 이 금액에 따라 다른 배율을 적용하십시오.
  4. 항목의 시간 감쇠를 기준으로 세 번째 요소를 적용하십시오. 분명히 오래된 항목은 새로운 항목보다 큰 벌점을받습니다.
  5. 총점으로 정렬. 결과 배열에는 가장 관련성이 높은 항목이 먼저 있어야합니다. 그런 다음이 배열을 20 개 정도의 항목으로 트리밍하고 페이지에 표시 할 수 있습니다.

당신은 아마,이 부진한 알고리즘 말할 수 하고,뿐만 아니라 그것은 내용의 모든 단일 조각을 끌어 쿼리를 실행해야하지만, 그 다음 별도의 쿼리 content_tags를 확인하기 위해 실행해야 않습니다, user_tagscontent_likes. 검색어가 너무 많습니다.

내 첫 번째 질문은 다음과 같습니다. 나는이 모든 것을 잘못하고있는 것입니까? 그 외에도 위에서 요약 한 모든 것을 최적화 할 수있는 방법을 생각해 볼 수 있습니까? 아이템과 사용자가 관련 태그를 가지고 있다고 가정하면 알고리즘 자체가 매우 잘 작동합니다. 그러나 내 content 테이블이 수만 가지 항목으로 커지면 정말 혼란 스러울 것입니다.

도움 주셔서 감사합니다.

+0

Q : 위에서 요약 한 모든 것을 최적화 할 수있는 방법을 생각해보십시오. A : 효율적인 쿼리를 위해 데이터베이스 스키마를 디자인하고 데이터베이스 인덱스를 만듭니다. – paulsm4

+0

각 콘텐츠의 점수를 추적하면 어떨까요? 그렇다면 당신은 그 모든 것을 통과하지 않아도되며, 그 내용에 대한 점수를 얻는 것만으로도 쉽게 될 것입니다. – kennypu

+0

점수를 추적하는 문제는 각 개인 사용자의 선호도에 따라 점수가 변경된다는 것입니다. 좋아요와 시간이 줄어들면 점수를 유지할 수 있지만 사용자 태그는 새로운 차원의 합병증을 추가합니다. –

답변

2

많은 쿼리를 사용하면 페이지 속도가 느려집니다. 가능한 한 적은 수로 조합 해보고 mysql 테이블의 인덱스를 사용하십시오! 색인을 생성하면 페이지 로딩 시간에 영향을 미친다는 것을 알 수 있습니다.

관련 문제