【问题标题】:MySQL DISTINCT more columnMySQL DISTINCT 更多专栏
【发布时间】:2016-01-22 14:24:19
【问题描述】:

我有一个包含大约 500k 行的日志表。

其中许多行是多余的(大约 50 条消息一次又一次地重复),所以我想按消息内容对它们进行分组。

但问题是我使用 MySQL 5.5 和这个版本的 InnoDB 引擎不支持全文索引。而且我无法使用 MyISAM,因为我正在使用外键。

我用 ORDER BY 子句尝试了这个,但花了大约 7 秒。

当我尝试使用 DISTINCT(message) 时,它在惊人的 300 毫秒内完成,但 DISTINCT 只给了我一列。

我应该如何使用 DISTINCT 以及所有其他列(如日期、id)构建 SELECT,但不影响性能?

【问题讨论】:

  • 你能在字段上创建一个复合唯一索引吗?
  • @bernd-buffen 好吧,我希望消息像它们一样,我不希望它们在开始时被过滤。
  • 请注意,DISTINCT 不是函数。
  • @strawberry 我是这样设计的。如果这个问题没有解决方案,我最终将不得不将其移植到 MyISAM 中
  • @Strawberry 现在我意识到我有外键,所以我不能使用 MyISAM

标签: mysql group-by distinct


【解决方案1】:

如果您的消息有很多重复,您可能希望将它们分开到“查找”表中。我想如果你不能在这个查找表中的消息上放置一个唯一索引,你只需要尽可能地在代码中强制执行它,甚至不时进行一些清理。

messages
--------
id
user_id
date
...
text (INT FK to message_text.id)

message_text
------------
id
text

这样您就不会一遍又一遍地重复消息文本,但messages 中的几行可以引用相同的文本。

【讨论】:

  • 好吧,我决定在日期+消息(100)上创建一个唯一索引,所以现在我的查找表中只有很少的日志,我有更好的位置来处理它们。我还举办了一个活动,每 3 天清理一次。非常感谢你 dan08 和@Strawberry
猜你喜欢
  • 2011-06-15
  • 1970-01-01
  • 2013-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多