2011-11-24 43 views
2

的列什麼。將選擇先前選擇的一對不同的隨機值從獨特的(非重複)的值的列的非最有效的方法的非?MySQL的優化:選擇先前選擇的隨機對不同的值從唯一值

我目前的做法是(保持每對在一個單獨的「mytable_associations」表中已關聯的值):

SELECT * FROM 
(
SELECT id,count(*) AS associations_count FROM mytable 
INNER JOIN mytable_associations 
WHERE (myvalue=myvalue1 OR myvalue=myvalue2) 
GROUP BY myvalue 
HAVING associations_count<(SELECT count(*) FROM mytable)-1 
ORDER BY rand() limit 1 
) mytable1 
LEFT JOIN 
(SELECT myvalue AS myvalue2 FROM mytable) mytable2 
ON mytable1.myvalue1<>mytable2.myvalue2 
WHERE 
(
SELECT myvalue1 FROM mytable_associations 
WHERE 
myvalue1=mytable1.myvalue1 AND myvalue2=mytable2.myvalue2 
OR 
myvalue1=mytable2.myvalue2 AND myvalue2=mytable1.myvalue1 
) IS NULL; 

(然後當然更新mytable_associations這個新協會)

其中,正如你所看到的,可以從一些優化中獲得巨大的收益。

(很抱歉在代碼中劣質壓痕,我真的不知道該怎麼縮進的mysql命令)。

你們能幫助我嗎?

(PS這是有史以來在這裏發佈我的第一個問題:知道我在做很多事情錯了,我會理解隨之而來的flamming,但請不要對我太狠心;))

+0

似乎有點棘手,瞭解您的查詢。您是否介意提供一些洞察力,例如解釋查詢的不同部分以及它們的作用?這將是巨大的,如果你可以給你想要什麼來實現 – Abhay

+0

基本上是兩個部分的虛例子:首先,我選擇不加上所有其他尚未值。我通過SELECT RANDOM FROM mytable WHERE(SELECT爲每個值FROM associations_table選擇關聯數)<(從mytable選擇count(*))-1。如果清楚的話,你可以看到其餘的只是選擇另一個尚未與associations_table中的值關聯的值:這就是最後兩個WHERE子句的用處。 – NotGaeL

+0

只是做了一個更新,使代碼更加混亂。希望它現在更具可讀性,但無論如何看看下面的Bill Karwin的解決方案,這正是我所尋找的 – NotGaeL

回答

2

涉及order by rand()的任何解決方案都將是低效的。替代方案,請參閱:

要排除你已經挑號,這裏就是我會做(這是僞代碼):

$c1 = SELECT COUNT(DISTINCT myvalue) FROM mytable 
$c2 = SELECT COUNT(*) FROM mytable_associations 

$offset = ROUND(RAND() * ($c1 * ($c1-1) - $c2)) 

SELECT v.* FROM (
    SELECT LEAST(m1.myvalue,my2.myvalue) AS myvalue1, 
    GREATEST(m1.myvalue,my2.myvalue) AS myvalue2 
    FROM (SELECT DISTINCT myvalue FROM mytable) AS m1 
    INNER JOIN (SELECT DISTINCT myvalue FROM mytable) AS m2 
    ON m1.myvalue <> m2.myvalue 
) AS v 
LEFT OUTER JOIN mytable_associations AS a USING (myvalue1,myvalue2) 
WHERE a.myvalue1 IS NULL 
LIMIT 1 OFFSET $offset 

通過確保myvalue1 < myvalue2,並依次將它們存儲在mytable_associations,可以簡化連接。

+0

不使用rand()的順序是一個改進,但關於第3點,我看不到「WHERE .myvalue1 IS NULL「避免了在選擇(a,b)和然後(b,a)時的重複性,而且當我嘗試運行時出現未知列myvalue1的錯誤(也嘗試了a.myvalue1和mytable_associations.myvalue1把它變成語法錯誤)。我應該將兩種組合添加到關聯表中以防止這種情況發生?當我嘗試運行導致此錯誤的解決方案時,我會做什麼錯誤? – NotGaeL

+0

(順便說一句,非常感謝您的快速回復:我剛剛開始使用SQL,有時候很難弄清楚如何正確完成工作) – NotGaeL

+0

道歉,我誤解了原始問題中的查詢,並且我誤解了你的表結構。我改寫了我的答案。 –