如何优化 MySQL 查询:用户读取最新消息
如何优化 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
问题的出现原因:这个问题的出现是因为查询的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查询的解决方法的整理。这些方法包括优化查询语句和创建索引,能够提高查询的效率,减少查询的数据量和读取的数据页数。