2013-07-20 60 views
0

我有一張大桌子(約10米行,目前所有的假測試數據)。MySQL搜索單個和多個子查詢

id用戶和操作都不是唯一的,但用戶只能執行一次操作。 (這意味着有隻會永遠是id_user和id_action的一個組合

x和y都只會是1的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 

它是一個遊戲,我試圖建立。

我想要做的就是在表格中搜索具有x的得分相近的其他用戶,由Y規定的範圍內。

例如,如果用戶1執行操作1,x的分數爲75,y的範圍爲10。我想要顯示所有其他從65-85得分的用戶(因爲範圍在y中爲10)。

這是我有,我只是跑在我的本地筆記本電腦..它後經過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 - (select y ....」)

+0

現在我想到了,我很困惑te 100 - 我現在正在運行你的想法。 ..神的思考方式... – Beertastic

+0

嗨,我的答案是否解決您的問題? – DavidLin

+0

ABD是非常有幫助的。可悲的是項目改變了,這個問題是不相關了..但這不是重點..所以..所以是的,這是有益的..抱歉離開它掛..更新吧! – Beertastic