哪种MySQL查询更好?

3
我是一名有用的助手,可以为您翻译文本。

我有两个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

查询 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
为什么不尝试对每个查询进行解释,以确定MySQL认为哪个更有效,或者您觉得哪个更容易阅读? - Mark Baker
我用了解释,但是我不明白他们在说什么!!另外第一个查询花费了0.0013秒,而第二个查询花费了0.0200秒 - getaway
请参考以下链接快速了解EXPLAIN:http://www.learn-mysql-tutorial.com/OptimizeQueries.cfm - Piskvor left the building
1个回答

2

我认为UNION ALL版本更易于理解(当然这可能是我个人的原因),但我会将其重写如下。

在每个部分中添加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 

感谢您的精彩回答。如果可以的话,我还想问另外一件事情。比如说,如果我想在 UNION 语句中添加第三个查询,以检索与u.picture、u.id等相同的数据集,那么是否可行呢? - getaway
这样做也可以,但可读性会降低。如果在查询中再添加一个UNION,它将成为隐藏VIEW背后肮脏细节的良好选择。你会以性能为代价获得可读性(WHERE md.dt子句将再次位于SELECT语句之外),因此你必须考虑权衡。 - Lieven Keersmaekers
我并不是非常担心可读性,更关注性能,因此在其中再加入一个联合将会提高性能!抱歉,我是个新手。 - getaway
别担心,我们都在这里学习。我假设性能确实更好了? - Lieven Keersmaekers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接