2012-09-17 2 views
1

나는 얼마나 많은 게시물이라는 포럼의 홈 페이지에 표시 할 특정 범주에서 게시물의 수를 계산하기 위해이 코드계수의 수는 최적

$sql1 = mysql_query("SELECT section_id FROM forum_posts WHERE section_id='$sectionID' "); 
$num_rows = mysql_num_rows($sql1); 

을 사용하고 있습니다 거기에 특정 섹션. 그 유형의 모든 게시물을 검토하는 것이 더 좋습니다. 나는 이것을 사용하면 엄청난 성능 저하가 될 것이라고 생각합니다.

편집 1 : 포럼의 각 섹션 아래 게시물 수를 표시하면 각 섹션의 현재 섹션 수를 홈페이지에서 확인하고 싶습니다. 그것에 대한 최적의 mysql 쿼리는 무엇이 될 것인가?

편집 2 : phpmanual에 명시된대로 mysql_query 함수를 대체해야합니까?

+0

mysql_ * 함수를 사용하지 마십시오. 더 이상 사용되지 않으며 ([* red box *] (http://php.net/manual/en/function.mysql-query.php) 참조) SQL injection에 취약합니다 . [* PDO *] (http://php.net/manual/en/book.pdo.php) 또는 [* MySQLi *] (http://php.net/manual/en/book.mysqli.php) – alfasin

답변

2

그냥 sql 자체에서 count를 사용하십시오.

$sql1 = mysql_query("SELECT count(post_id) as 'count_of_posts' FROM forum_posts WHERE section_id='$sectionID' "); 

동시에 모든 섹션 수를 얻고 싶은 경우에 당신은 이런 식으로 할 수 있습니다 :() 집계 함수

$sql1 = mysql_query("SELECT section_id, count(post_id) as 'count_of_posts' FROM forum_posts WHERE section_id='$sectionID' group by section_id"); 
+0

+1 - 'distinct'도 사용하고 싶을 것입니다. – alfasin

+0

확실한 이유가 확실하지 않은 경우, 고유 한 group_id만으로도 충분합니다. – iouri

0

SELECT distinct section_id, count(section_id) as num_of_posts FROM forum_posts WHERE section_id='$sectionID' group by section_id 그런 다음 $ num_of_rows = $ sql1 [ 'num_of_posts']을 (를) 수행하십시오.

또는 그대로 쿼리를 유지하려면 count($sql1);

1

그것은 더 정상적인 SQL이다가, 카운트를 사용하여 행을 계산하기를 . 한 번에 여러 섹션을 계산해야하는 경우 GROUP BY를 사용하십시오. 하지만 그걸 알았지?

먼저 벤치 마크를 실행하고 초를 최적화하십시오.

  1. 프로덕션 크기의 데이터로드로 테스트 서버 (프로덕션 사양이어야 함)를로드하십시오. 모든 매개 변수를 프로덕션 서버와 동일하게 구성하십시오.
  2. 반복적으로 코드를 실행하고 시간을 측정하십시오.
  3. 속도가 느려지지 않으면 작업이 완료된 것입니다.

내 제안 :

  1. 쿼리를 설명한다. 전체 테이블 스캔을 실행중인 경우 섹션 ID에 인덱스를 추가하십시오. 최소한 전체 인덱스 스캔까지는 전체 테이블 스캔을 줄여야합니다. 이것은 여전히 ​​너무 느릴 수 있습니다.
  2. 여전히 너무 느린 경우 결과를 어딘가에 캐싱하는 것이 좋습니다. 게시물이 추가, 삭제 또는 다른 섹션으로 이동되면이 캐시를 무효화 할 수 있습니다.
  3. 캐싱이 불편하거나 작동하지 않는 경우 (예 : 캐시에서 적중률이 90 % 미만인 경우), 카운트를 영구 저장하고 수동으로 조정하십시오. 그런 다음 게시물의 내용이 변경되지 않은 경우 섹션의 개수를 다시 계산할 필요가 없습니다.

1e9 개의 게시물이 1e3 섹션에 있다고 가정합니다. 대부분의 섹션의 게시물은 변경되지 않습니다. 예를 들어 추가/삭제, 한 섹션 만 업데이트, 두 섹션 이동, 998 섹션의 카운트는 변경되지 않고 값 비싼 계산을 피하는 등 작업에 의해 영향을받는 섹션의 카운트를 수정할 수 있습니다 작업.

하지만 1e9 게시물이 있다고보기는 어렵습니다 (Stackoverflow는 그렇지 않음).

스택 오버 플로우가 어떻게 태그를 관리하는지 조사해보십시오. 질문 수는 중요합니다.

+0

지금 forum_posts에 약 10k 개의 게시물이 있으며 0.02 초에 쿼리가 수행되고 있습니다. 더 최적화 될 수 있습니까? –

+0

행을 계산하려면 COUNT() 쿼리를 사용하십시오. 더 이상의 최적화는 아마도 기다릴 수 있습니다. – MarkR