2013-07-20 2 views
0

큰 테이블 (10m 행 약, 모든 가짜 테스트 데이터가 있습니다.).MySQL 검색 단일 및 다중 subselects

id 사용자와 작업은 모두 고유하지 않지만 사용자는 한 번만 작업을 수행 할 수 있습니다. (오직 id_user 및 id_action 중 하나 콤보가있을 것입니다 의미

x와 y는 모두 단 하나의 INT가 될거야 -.. 나는 모든 열을 색인 한 100

CREATE TABLE IF NOT EXISTS `test` (
`id_user` int(11) NOT NULL, 
`id_action` int(11) NOT NULL, 
`x` int(11) NOT NULL, 
`y` int(11) NOT NULL, 
KEY `x` (`x`), 
KEY `y` (`y`), 
KEY `id_user` (`id_user`), 
KEY `id_action` (`id_action`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 

그것은 내가 구축을 위해 노력하고있어 게임을합니다.

는 내가 뭘 원하는 Y에 의해 결정 범위 내에서, X의 비슷한 점수를 다른 사용자의 테이블을 검색 할 수 있습니다.

예를 들어, 사용자 1이 x가 75 인 작업 1을 수행하고 y가 10 인 경우. 나는 범위가 y에서 10 세트이므로 65-85 점을 얻은 다른 모든 사용자를 보여주고 싶습니다.

내가 있는데 난 그냥 300 초 후에 제한 시간을 초과 .. 내 로컬 노트북에 그것을 실행 것입니다 ... :(

SELECT * FROM test 
WHERE 
id_user != 1 AND 
x BETWEEN 
((SELECT x from test WHERE id_action = 1 AND id_user = 1) - (100 - (SELECT y FROM test WHERE id_action = 1 And id_user = 1))) 
AND 
((SELECT x from test WHERE id_action = 1 AND id_user = 1) + (100 - (SELECT y FROM test WHERE id_action = 1 And id_user = 1))); 

내가 가지고있는 10,000,000 행에이 검색 (100 100,000 명의 테스트 사용자가있는 액션 .. 모든 난수)가 실패합니다.

이제 테이블 자체에 대해 조사 할 것이지만 하위 선택이 더 효율적이라고 생각합니다. 여기로 가십시오 ... 조언은 높이 평가 될 것입니다 ... :)

답변

1

2 개의 쿼리에 대해 하나는 x의 범위를 가져오고 다른 하나는 실제 검색을 수행합니다.

당신이 정말로 하나 개의 쿼리를 수행 할 경우

, 당신은이 쿼리는 자기 조인이

Select t0.* from test t0, test t1 where t1.id_user=1 AND t0.id_user !=1 
AND abs(t1.x-t0.x) <= t1.y 

을 시도 할 수 있습니다 그리고 난 그것이 당신의 쿼리보다 훨씬 더 좋은 성능을 확신합니다. 또한 abs 함수를 사용하여 x 범위를 필터링합니다. 그런데 y가 범위 (예 : 10)이고 타겟팅 x 범위가 t1.x - t0.y에서 t1.x + t0.y까지라고 가정합니다. "100 - (선택 y ....") 귀하의 쿼리에 혼동스러워했습니다.

+0

나는 그것에 대해 생각하기에, 나는 테 100으로 혼란 스럽습니다 - 지금 당신의 아이디어를 실행 중입니다. .. 그것에 대해 생각하는 신의 방식 ... – Beertastic

+0

안녕하세요, 내 대답은 당신의 문제를 해결합니까? – DavidLin

+0

ABD 정말 도움이되었습니다. 슬프게도 프로젝트가 변경되었고이 질문은 더 이상 관련이 없습니다 ..하지만 그게 요점이 아니에요 .. 그래서 네, 도움이되었습니다 .. 교수형에두고 떠나 죄송합니다 .. 지금 업데이트하십시오! – Beertastic

관련 문제