2010-09-22 101 views
3

我有2個mysql查詢,檢索相同的數據?,你認爲哪個更好用,爲什麼?考慮到標準和更好的代碼等。對不起,如果這是一個愚蠢的問題,但我是一隻好奇的貓!所以這裏有雲:什麼mysql查詢比較好?

查詢1:

SELECT * 
FROM 
((
    SELECT u.username, u.picture, m.id, m.user_note, m.reply_id, m.reply_name, m.dt 
    FROM relationships r 
    JOIN notes m ON m.user_id = r.leader 
    JOIN user u ON r.leader = u.user_id 
    WHERE r.listener ='2' 
) 
UNION ALL 
(
    SELECT u.username, u.picture, m.id, m.user_note, m.reply_id, m.reply_name, m.dt 
    FROM notes m 
    JOIN user u ON m.user_id = u.user_id 
    WHERE u.user_id ='2' 
)) d 
WHERE d.dt < '2010-09-20_131830' 
ORDER BY d.dt DESC 

QUERY 2:

SELECT u.username, u.picture, m.id, m.user_note, m.reply_id, m.reply_name, m.dt 
FROM notes m 
INNER JOIN user u 
ON m.user_id = u.user_id 
WHERE (m.user_id = '2' 
OR m.user_id IN (
    SELECT r.leader 
    FROM relationships r 
    WHERE r.listener ='2')) 
AND dt < '2010-09-20_131830' 
ORDER BY dt DESC 
+4

爲什麼不嘗試爲每個查詢做一個EXPLAIN來確定MySQL認爲哪一個更高效,或者哪些更容易閱讀? – 2010-09-22 10:30:25

+0

我用解釋,但我不明白他們在說什麼!加上第一個查詢花了'0.0013秒',而第二個查詢花了'0.0200'秒! – getaway 2010-09-22 10:34:12

+0

參見例如這是一個快速介紹到'EXPLAIN':http://www.learn-mysql-tutorial.com/OptimizeQueries.cfm – Piskvor 2010-09-26 16:23:38

回答

2

我找到UNION ALL版本更容易理解(這可能是我offcourse),但我把它改寫如下。

AND m.dt < '2010-09-20_131830添加到每個部分應該會給你更好的性能。
您可以運行它幾次,並驗證它是否有所作爲。

SELECT u.username 
     , u.picture 
     , m.id 
     , m.user_note 
     , m.reply_id 
     , m.reply_name 
     , m.dt 
FROM relationships r 
     INNER JOIN notes m ON m.user_id = r.leader 
     INNER JOIN user u ON r.leader = u.user_id 
WHERE r.listener ='2' 
     AND m.dt < '2010-09-20_131830' 
UNION ALL 
SELECT u.username 
     , u.picture 
     , m.id 
     , m.user_note 
     , m.reply_id 
     , m.reply_name 
     , m.dt 
FROM notes m 
     INNER JOIN user u ON m.user_id = u.user_id 
WHERE u.user_id ='2' 
     AND m.dt < '2010-09-20_131830' 
ORDER BY m.dt DESC 
+0

感謝您的一個明智的答案,如果我可能要求另一件事,也說我想添加第三個查詢工會,這將檢索相同的數據集u.pictue,u.id等會好嗎? – getaway 2010-09-22 10:41:14

+0

這將是好的,但它也會變得不太可讀。將另一個UNION添加到查詢中將使其成爲一個隱藏VIEW背後的髒東西的好候選者。您會以性能爲代價獲得可讀性(WHERE md.dt子句將再次超出SELECT語句),所以您必須考慮權衡。 – 2010-09-22 10:56:36

+0

我不是真的擔心可讀性和性能一樣,所以基本上把另一個工會換成他們會更好的表現!!對不起,我是一個這樣的新手 – getaway 2010-09-22 11:23:49