2013-07-16 6 views
0

쿼리 후 랜덤 화 된 행을 갖고 싶지만 order by rand()을 사용하면 120k + 행을 가진 테이블이 고갈되고 있습니다. 난 그냥 행 번호를 출력하지만 그것은 임의의 인덱스에서 시작한 다음 그 다음 #number 행을 반환하는 작은 솔루션을 발견했다. 이것은 꽤 빠르지 만 이것은 임의의 인덱스 뒤에 몇 개의 행을 반환합니다. 코드는 같이 간다 :mysql 무작위 결과 및 최적화

SELECT * 
FROM lieky AS r1 JOIN 
    (SELECT (RAND() * 
       (SELECT MAX(col_0) 
        FROM lieky)) AS id) 
    AS r2 
WHERE r1.col_0 >= r2.id 
ORDER BY r1.col_0 ASC 
LIMIT 100 

와 나는 여기에서 그것을 발견 : 나에게 도움이 될 일이 http://jan.kneschke.de/projects/mysql/order-by-rand/

있습니까?

랜덤 화 된 데이터를 페이지 매김으로 가져 오려고하므로 사용자가 데이터베이스를 쿼리 할 때 항상 임의의 순서로 행을 가져옵니다. 도움 주셔서 감사합니다.

답변

1

내가 좋은 생각 (r1.col_0> = r2.id가 WHERE 때문에)

(SELECT (RAND() * (SELECT MAX(col_0) FROM lieky)) AS id) 

가 MAX (col_0)를 반환 할 수 있습니다, 그래서 당신은 단지 1 행을 얻을 것이다 주목해야한다 솔루션은 다음과 같이해야합니다 :

  • 두 개의 열을 추가하십시오. groupId int, seed int; 인덱스 indexName (의 groupId, 씨앗)
  • 모든 x 초 다시 계산이 열
  • 사용자가 행이 처음으로 목록을 열 (또는 때 (아래 참조)가 될 것이다 (아마도 모든 시간, 일, ..) 실행 스크립트를 추가 아이템을 다시 랜더링하고 싶을 때 임의의 groupId를 사용자의 세션에 저장합니다; groupId는 0에서 (lieky에서 max (groupId) 선택)
  • 과 같은 쿼리를 사용하여 행을 표시 할 수 있습니다. (select * from lieky where groupId = 시드 저장 한도 x, 100에 따라 % saved groupId % 순서) -이어야합니다. 매우 빠름

recalc 스크립트에 대해서는 다소 느립니다 (야간에 실행하는 것이 좋습니다). 사용하여 업데이트 할 수
시드 : 먼저 N 개의 행에 대한 그룹 ID = 0으로 설정

update lieky set Seed = rand()*1000000 

는 그룹 ID = 1이면 N 행에 따라 대 ...
N은 사용자에게 보여줄 수있는 최대 행 (인 max_page) * (per_page_count)

+0

물론 그럴 가능성도 있지만 클릭 할 때마다 작성하는 것이 좋습니다. 고맙습니다 – kalafun