如何使用SQL查询处理大量行并有效地获取少量数据?

时间:2015-08-07 21:19:37

标签: php mysql sql

我正在用PHP编写网站,网站将包含很多用户将在网站上发布的消息(如100.000,200.000或更多)。问题是,消息将通过它的ID存储在名为“site_messages”的表中。这意味着,所有邮件都不按其海报分组,而是根据其ID进行分组。如果我想获取用户'foo'发布的消息,我必须查询很多行,我认为它会变得非常慢。或者我想通过帖子主题获取消息(是的,它也将包含帖子主题列,可能还有更多列要添加),我必须再次查询所有表,不幸的是,效率会降低。那有什么快速的解决方案吗?我正在使用PHP和MySQL(以及PHPMyAdmin)。

编辑例如,我的表格如下所示:

MessageID:1

MessageContent(Varchar,这是用户发布的消息):您好我喜欢这个网站。再见!

MessagePoster(Varchar):crazyuser

MessagePostDate:12/12/09

MessagePostedIn(Varchar,这是帖子主题):如何制作披萨

MessageID:2

MessageContent(Varchar):这个网站真的很糟糕。

MessagePoster(Varchar):top_lel

MessagePostDate:12/12/09

MessagePostedIn(Varchar):您好,我有一个问题!

消息ID:3

MessageContent(Varchar):这个网站的管理员是谁?

MessagePoster(Varchar):creepy2000

MessagePostDate:1/13/10

MessagePostedIn(Varchar):这个网站很无聊。

等...

2 个答案:

答案 0 :(得分:1)

这就是DB(尤其是关系数据库)的构建方式! MySql和其他数据库使用索引之类的东西来帮助您以最有效的方式访问所需的行。您可以编写select * from site_messages where subject like "News%" order by entryDateTime desc limit 10之类的查询来查找以"新闻"或select * from site_messages, user where user.userid='foo' and site_messages.fk_user=user.id开头的最新十条消息,以查找特定用户的所有帖子,以及您我发现它表现得非常好。对于这些,您可能(以及其他)主题列的索引和fk_user列的索引。

努力建立一个好的表结构(数据模型)。当然,如果您遇到问题,可以研究数据库性能以及explain计划帮助的主题。

是的,对于您想要的每组列,您将再次查询该表。将查询视为一组行。避免在连接上发送大量行。正如其他评论者所建议的那样,如果没有关于您的牌桌的详细信息,我们将无法提供更多帮助。

答案 1 :(得分:1)

两个直接跳出索引的候选人是(Poster,PostDate)和(PostDate,Poster)以帮助查询表格:

select  ...
from    ...
where   Poster = @PID and PostDate > @Yesterday;

select  Poster, count(*) as Postings, ...
from    ...
where   PostDate > @Yesterday
group by Poster;

select  Poster, ...
from    ...
where   PostDate between @DayBeforeYesterday and @Yesterday;

请记住,索引会以牺牲DML操作(插入,更新,删除)为代价来改进查询。如果查询/ DML比率非常低,您可能希望使用较慢的查询。