【问题标题】:what mysql query is better?什么mysql查询更好?
【发布时间】:2011-04-15 15:54:25
【问题描述】:

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

【问题讨论】:

  • 为什么不尝试对每个查询进行 EXPLAIN 来确定 MySQL 认为哪个更有效,或者您觉得哪个更容易阅读?
  • 我用了解释,但我不明白他们在说什么!!加上第一个查询花费了0.0013 sec 并且第二个查询花费了0.0200 秒!
  • 参见例如这是对EXPLAIN的快速介绍:learn-mysql-tutorial.com/OptimizeQueries.cfm

标签: mysql performance select


【解决方案1】:

我发现UNION ALL 版本更容易理解(那可能是我的偏题),但我会重写如下。

AND m.dt &lt; '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 

【讨论】:

  • 感谢您的精彩回答,如果我还想问另一件事,比如我想向联合中添加第三个查询,它将检索相同的数据集 u.pictue、u.id 等可以吗?
  • 没关系,但它的可读性也会降低。向查询中添加另一个 UNION 将使其成为将脏细节隐藏在 VIEW 后面的好选择。您将以牺牲性能为代价获得可读性(WHERE md.dt 子句将再次位于 SELECT 语句之外),因此您必须考虑权衡。
  • 我并不像性能那样担心可读性,所以基本上把另一个联合放在他们的性能会更好!!,对不起,我是这样的新手
  • 别担心,我们都在这里学习。我认为性能确实更好?
猜你喜欢
  • 2015-02-03
  • 2014-11-30
  • 2017-02-26
  • 2011-03-09
  • 2020-10-24
  • 1970-01-01
  • 2023-03-03
  • 2017-12-29
  • 1970-01-01
相关资源
最近更新 更多