2010-01-31 9 views
1

아 누락 ​​Select n objects randomly with condition in Rails에서 친절하게 무작위>이 = X있는 레일은 DB가

Post.all(:conditions => ["votes >= ?", x], :order => "rand()", :limit => n) 

내 관심은보다 더 X 투표가 게시물의 숫자가되는 표와 n 개의 게시물을 선택하려면이 답을 제시 쿼리 수행 주문 매우 큰.

DB가이 기준을 쿼리에 적용하는 순서는 무엇입니까?

합니까 그것은

  • 의 (a) 표> X가 n 개의 게시물을 선택한 다음이 randomises? 또는
  • (b) 투표> x 인 모든 게시물을 선택한 다음 임의로 선택하고 첫 번째 게시물을 n 개 선택 하시겠습니까?
  • (c) 기타?

답변

3

개발 로그를 확인하는 것이 좋습니다.

그러나이 경우 무작위 화가 MySQL 끝에서 발생하며 Active Record 내부에서는 일어나지 않습니다. MySQL 내에서 쿼리가 어떻게 실행되는지 보려면 로그에서 쿼리를 복사하여 MySQL 도구 (콘솔, GUI 등)에 붙여 넣고 "EXPLAIN"을 앞에 추가하십시오.

당신은 같은 결과가 발생해야한다 : 내가 MySQL의에서 비슷한 쿼리를하려고하면

EXPLAIN SELECT * FROM posts WHERE votes >= 'x' ORDER BY rand() LIMIT n 

는, 나는 듣는다 :

Select Type: SIMPLE 
Using where; Using temporary; Using filesort 

그런 다음 당신이 우수한 중 일부에 대한 검색을 수행해야합니다 그래서 MySQL 쿼리를 최적화하는 방법에 대한 조언. 문제가있는 경우 투표 열에 색인을 추가하면 성능이 향상 될 수 있습니다. 상태.

+0

고마워 Toby, 평소와 같이 매우 도움이된다 – Victor

0

생성 된 쿼리에 대해 development.log을 보면 실마리를 줄 수 있습니다.

+0

감사합니다. JRL. 그것을 시도 할 것인가 – Victor

1

Toby가 이미 지적했듯이 이것은 순수하게 최대 SQL 서버이며 모든 것이 쿼리 자체에서 수행됩니다.

그러나 데이터베이스가 전체 결과 집합을 먼저 얻은 다음 임의 화하지 않는 한 실제로 무작위로 출력 할 수는 없습니다. 하지만 EXPLAIN 결과를 확인해야합니다.

+0

감사합니다 Mladen, 나는 EXPLAIN을 점검 할 것이다. – Victor