나는 700,000 개의 mysql 쿼리를 반복하지 않고도 데이터 집합을 수집하는 방법을 찾으려고합니다.제한된 그룹화 된 서브 세트를 모으기위한 서브 쿼리
내가
ip unique varchar(20),
most_recent datetime,
count (int)
users
와
id autoincrement,
time timestamp,
username varchar(200),
email varchar(100),
ip varchar(20)
및 uniq_ip
두 테이블
users
이 25 개 백만 행을 가지고 있으며, 그들이 사이트에서 작업하는 사용자의 활동을 기록합니다. uniq_ip
에는 모든 IP 번호 목록과 사용자에게 나열되는 횟수 (트리거 업데이트시)가 있습니다.
백일향 코드를 코딩하는 동안 uniq_ip
에서 모든 IP 목록을 가져 와서 반복하여 각 IP에 대해 최신 2000 레코드를 얻습니다. uniq_ip
가 70 개 행이,이 루프는 내가 IP를 각각 가장 최근의 2000 목록을 사로 잡고 단일 쿼리를 얻으려고
select * from users where ip = '$outerloopip' order by `time` desc limit 2000;
사용, 70 만 쿼리가 총 제작, 정말 불쾌한입니다. 1.2.3.4가 10,000 번 나열되면 시간 필드를 기준으로 가장 최근의 2000을 원합니다.
아이디어 하나의 쿼리에서 어떻게 할 수 있습니까?
나는 MySQL의에 아이들이 내 모든 음식을 먹고 마친 순간이 떨어질 수 있습니다. 이 테이블은 1 년 넘은 모든 데이터를 삭제하므로 문제가되지 않습니다. 이 테이블은 현재 2 천 5 백만 행 (약 8 천만 명으로 줄어들 것입니다)이지만, Redis ZSET 데이터 세트를 업데이트하기 위해 일주일에 한 번만 실행됩니다. – pedigree
몇 가지 추가 드라이브 공간을 넣고 다시 시도해야합니다 .- 질문 : tmp 드라이브가 고갈되기 전에 쿼리가 11GB 사용자 테이블에서 80GB의 임시 SQL 파일을 생성 할 수있었습니다. – pedigree
@pedigree, 소리가 나지 않습니다. 맞아 ... 웃음 소리 만 들으면 시나리오를 테스트하고 2000 카운트를 바꾸어서 50 또는 100을 말하면서 그 개념을 테스트합니다. – DRapp