2013-03-27 198 views
0

我有一個包含用戶信息和相關表的用戶表,它將向當前用戶顯示相關用戶。優化關聯表查詢

要獲得相關用戶到用戶ID「25」我的查詢看起來像

SELECT 
    id 
FROM users u 
    INNER JOIN (SELECT 
       primary_id, 
       secondary_id 
       FROM users_rel 
       WHERE primary_id = '25' 
        OR secondary_id = '25') temp 
    ON (u.id = temp.primary_id 
     OR u.id = temp.secondary_id) 
WHERE u.id != '25' 

這裏的問題是,在users_rel表中的用戶ID可以是在初級側或次級側。不要告訴我改變它,因爲它已經完成了600萬條記錄,所以我不能改變它。這個查詢需要2到5分鐘以4000記錄在user_rel表中執行,629241users表中執行。

user_rel TABLE 
.--------------------------------. 
| id   | (VARCHAR,36) | 
| primary_id | (VARCHAR,36) | 
| secondary_id | (VARCHAR,36) | 
| del  | (TINYINT,1) | 
|.______________________________.| 

和索引定義爲primary_id組合secondary_id

+0

你可以發佈'users_rel'的模式是如何設計的嗎?是聲明爲外鍵的兩列還是它們有任何索引定義? – 2013-03-27 07:32:32

+0

你可以使用'25 IN(\'primary_id \',\'secondary_id \')' – hjpotter92 2013-03-27 07:35:21

回答

1

其已經完成了6萬條記錄,所以我不能改變它

長出了一對性交 - 你」我已經得到了一個相對較小的表中的數據量沒有理由不修復壞的設計。

如果您發佈了表和解釋計劃的確切結構(即創建表語句),這將有所幫助。

爲什麼你使用子查詢而不是加入表?再次開始給你的東西,你可以開始優化:

SELECT u.id 
FROM users u 
INNER JOIN users_rel r 
    ON 25 in (primary_id, secondary_id) 
    AND (u.id = r.primary_id 
     OR u.id=r.secondary_id) 
WHERE u.id != '25'; 

這應該會給出相同的結果。是否更快......我們不知道。

指數被定義爲primary_id的組合和secondary_id

爲什麼呢?對於這個查詢不會有太大的幫助 - 你需要在secondary_id上的primary_id上有兩個索引。