2011-02-10 46 views
0

我有我的WordPress查詢插件這樣的:SQL:鏈接加入效率

SELECT users.*, U.`meta_value` AS first_name,M.`meta_value` AS last_name 
    FROM `nwp_users` AS users 
     LEFT JOIN `nwp_usermeta` U 
      ON users.`ID`=U.`user_id` 
     LEFT JOIN `nwp_usermeta` M 
      ON users.`ID`=M.`user_id` 
     LEFT JOIN `nwp_usermeta` C 
      ON users.`ID`=C.`user_id` 
    WHERE U.meta_key = 'first_name' 
     AND M.meta_key = 'last_name' 
     AND C.meta_key = 'nwp_capabilities' 
    ORDER BY users.`user_login` ASC 
    LIMIT 0,10 

我是新來使用JOIN,我想知道它是如何有效地使用如此多的在一個查詢JOIN 。把它分成多個查詢更好嗎?

The database schema can be found here.

回答

3

JOIN如果密鑰索引通常沒有那麼糟糕。 LEFT JOIN幾乎總是表現出色,如果可能的話應該避免。不同的是,即使您要加入的列爲NULL,LEFT JOIN也會加入連接表中的所有行。常規(直接)JOIN只是加入匹配的行。

發佈你的表結構,我們可以給你一個更好的查詢。

+0

在這種情況下,表我加入總會有一排符合我的標準。但是如果常規JOIN更快,我會使用它。如果你有興趣,這是一個香草WordPress安裝,所以表格架構在這裏列出:http://codex.wordpress.org/Database_Description#Table:_wp_users – 2011-02-10 16:24:12

2

看到這個評論:

http://forums.mysql.com/read.php?24,205080,205274#msg-205274

對於它的價值,找出MySQL正在做的和看到,如果你有正確的索引,經常檢查EXPLAIN計劃。你可以通過在查詢之前加入EXPLAIN來解決這個問題(在查詢之前逐字地添加EXPLAIN一詞),然後運行它。

在您的查詢中,您有一個篩選器AND C.meta_key = 'nwp_capabilities',這意味着它上面的所有LEFT JOIN可以等同寫爲INNER JOIN。因爲如果LEFT JOINS失敗(LEFT OUTER旨在保留左側的結果),結果將被WHERE子句過濾掉100%。

所以一個更優化查詢是

SELECT users.*, U.`meta_value` AS first_name,M.`meta_value` AS last_name 
    FROM `nwp_users` AS users 
     JOIN `nwp_usermeta` U 
      ON users.`ID`=U.`user_id` 
     JOIN `nwp_usermeta` M 
      ON users.`ID`=M.`user_id` 
     JOIN `nwp_usermeta` C 
      ON users.`ID`=C.`user_id` 
    WHERE U.meta_key = 'first_name' 
     AND M.meta_key = 'last_name' 
     AND C.meta_key = 'nwp_capabilities' 
    ORDER BY users.`user_login` ASC 
    LIMIT 0,10 

(注: 「加入」(單獨)= 「INNER JOIN」)