使用更好的MySQL查询对最后的消息进行分组

使用更好的MySQL查询对最后的消息进行分组,mysql,sql,Mysql,Sql,我正在尝试显示所有最近的消息列表,类似于你在Facebook上查看所有消息(并显示谁最后发送消息和消息)时看到它们的方式 我的桌子看起来像这样: id | userid | fromuserid | touserid | message | time 1 | 1 | 1 | 2 | test1 | 1428882596 2 | 2 | 1 | 2 | test1 | 1428882596 3 |

我正在尝试显示所有最近的消息列表,类似于你在Facebook上查看所有消息(并显示谁最后发送消息和消息)时看到它们的方式

我的桌子看起来像这样:

id | userid | fromuserid | touserid | message | time
 1 |   1    |     1      |    2     |  test1  | 1428882596
 2 |   2    |     1      |    2     |  test1  | 1428882596
 3 |   2    |     2      |    1     |  test2  | 1428882600
 4 |   1    |     2      |    1     |  test2  | 1428882600
存在userid是因为消息是重复的(每个用户都有他/她自己的消息副本,因此他们可以删除它们,还因为他们有可以存储的最大消息的限制)

这是我的问题:

   SELECT messages.*
        , users.username
        , users.firstname
        , users.lastname
     FROM messages
LEFT JOIN users ON ( users.id            = messages.fromuserid
                     AND messages.touserid   = '$userid' )
                OR ( users.id            = messages.touserid
                     AND messages.fromuserid = '$userid' )
    WHERE messages.id IN ( SELECT MAX(id)
                             FROM messages
                            WHERE userid = '$userid'
                            GROUP BY GREATEST(fromuserid, touserid)
                                     , LEAST(fromuserid, touserid) )
    ORDER BY messages.time DESC 
查询工作正常,但速度非常慢(执行大约0.1-0.2秒,表中有大约8000个条目)。我也设置了索引,只是查询速度慢

有没有人知道一种更好的方法,不用创建额外的表来存储最后的消息?无论我做了多少尝试,我总是会想到我需要创建一个额外的表,如果可能的话,我希望避免这样做

编辑:我知道文本复制是一个坏主意(我将为此创建一个单独的表格),我的问题只是分组和显示最后的消息,如果没有额外的表格就可以这样做的话


非常感谢

您需要尽可能多的表(在合理范围内)

第一条规则,联系,不要重复

如果可以,还可以为列编制索引

CREATE FULLTEXT INDEX idx ON `messages`(`message`);
全文索引是在基于文本的列(CHAR、VARCHAR或text列)上创建的,有助于加快对这些列中包含的数据的查询和DML操作,省略任何定义为stopwords的单词

全文索引定义为CREATETABLE语句的一部分,或使用ALTERTABLE或CREATEINDEX添加到现有表中


如果您关心性能,有时最好使用
标志处理复杂的查询(我们在表中添加了额外的列)

1-在消息表中添加一列,将其命名为
isLast
,将默认值设置为
1

2-在插入之前创建一个触发器
,以更新消息中属于当前用户的每一个旧行(我假设您可以使用NEW.touserid或NEW.fromuserid获得它),设置isLast=0


3-然后当与用户加入消息时,您只需在条件(无子查询)中选中
isLast>0

0.1-0.2 s=非常慢?如果格式正确,lolSQL的编写和读取都会容易得多!文本字段的多个副本。smh。看看为什么您只对8000个条目(重复)使用rdbms,我认为这有点慢。。我所有的其他查询执行速度都快得多,大约在0.001-0.02之间。@BrianPatterson我同意,这有点不对劲,我可能会为文本创建一个单独的表。缓慢的查询问题与此无关。是的,我明白,这也是我在我的问题中提到的,我只是想知道是否有另一种方法来分组它们并显示最后的消息,而不只是为此创建一个额外的表,让我们考虑文本复制不在那里,因为我将修复这一个。谢谢你索引了文本列了吗?没有,我索引了:id,userid,fromuserid,touserid,time。我不使用文本消息列,为什么要索引它?这有什么帮助?我根本没有在短信栏中使用/搜索,为什么需要这样做?谢谢你的帮助,但它没有改变任何东西(也尝试过)。这是一个好主意!所以我的选择是要么这样做,要么创建一个单独的表来存储最后一个。谢谢