如何优化 MySQL 查询:用户读取最新消息

9 浏览
0 Comments

如何优化 MySQL 查询:用户读取最新消息

请帮忙优化查询。

我有一个带有以下字段的表格:

  • 'comment_parent':接收消息的用户
  • 'user_id':发送消息的用户
  • comment_karma:当用户阅读消息时设置为1
  • 'updated':用户阅读消息的日期和时间

如何获取最近7天内阅读最后一条消息的收藏列表?

有没有更好的方法来找到最后一条消息,然后选择最大的(updated)?

SELECT wc.comment_parent, wc.user_id, wc.updated FROM `wp_comments` wc
WHERE (wc.comment_parent IN (4786, 322, 1492, 257, 4760, 40, 41) AND wc.user_id = 1)
AND wc.`comment_karma` = 1
AND updated = (SELECT max(`updated`) FROM `wp_comments` as cc WHERE cc.`user_id` = wc.user_id AND comment_parent = wc.comment_parent)
AND updated > DATE_SUB(NOW(), INTERVAL 1 WEEK)
ORDER BY wc.updated DESC LIMIT 0, 30

0
0 Comments

问题的出现原因:需要对MySQL查询进行优化,以提高查询速度。

解决方法:

1. 使用上述提供的查询语句,该查询语句通过使用max()函数和GROUP BY子句,以及合适的筛选条件和排序方式,可以更快地检索到所需的结果。

2. 还可以尝试其他方法来检索相同的结果,以进一步优化查询性能。

0
0 Comments

问题的出现原因:这个问题的出现是因为查询的SQL语句效率不高,需要进行优化。

解决方法:通过创建索引和优化查询语句来提高查询效率。

具体的解决方法如下所示:

1. 优化查询语句:

将原始的查询语句改写为以下形式:

   SELECT
       wc.comment_parent, wc.user_id, wc.updated
   FROM
       `wp_comments` wc
   WHERE
       wc.comment_parent IN (4786, 322, 1492, 257, 4760, 40, 41)
       AND wc.user_id = 1
       AND wc.comment_karma = 1
       AND updated = (
           SELECT
               max(`updated`)
           FROM
               wp_comments as cc
           WHERE
               cc.updated > now() - INTERVAL 1 WEEK
               AND cc.user_id = wc.user_id
               AND cc.comment_parent = wc.comment_parent
       )
   ORDER BY
       wc.updated DESC
   LIMIT
       0, 30;
   

通过这种方式可以减少查询的数据量,提高查询的效率。

2. 创建索引:

创建以下索引:

   CREATE INDEX idx_wp_comment_rel
       ON wp_comments (user_id, comment_parent, updated DESC, comment_karma);
   

这个索引是一个相对较小的索引,但是它可以让子查询只检查索引(索引中包含了所有必要的数据)。需要注意的是,当前版本的MySQL和MariaDB识别索引中的DESC关键字,但是不处理它。当它们处理DESC关键字时,找到max(update)将变得简单。

以上就是对于如何优化MySQL查询的解决方法的整理。这些方法包括优化查询语句和创建索引,能够提高查询的效率,减少查询的数据量和读取的数据页数。

0