0

首先,我不得不说这个话题是非常普遍的话题。我研究了所有相关主题,但找不到答案。我有三张桌子。Messages 表有 300.000 行,tags 表有 100 万行,message_tag 表有大约 1000 万行。message_tag.message_id 和 message_tag.tag_id 列有索引。我的目的是选择链接指定标签的消息。但是查询时间太长了。没有任何查询时间短于 20 秒。另一方面,由于查询时间长,有时查询甚至没有给出结果。表结构和我的查询如下。我该如何处理这个问题?我开放所有建议。即使我可以使用新架构重新创建表。数据库是 MySql,存储电机是 MyIsam。.

table name: messages
columns :
id (int)
message (vharchar)
message_poster (vharchar)

table name: tags
id (int)
tag (vharchar)

table name : message_tag
columns :
message_id (int)
tag_id (int)

我的查询:

SELECT                    messages.message_poster,
                          messages.message
                     FROM tags, messages, message_tag 
                     WHERE message_tag.tag_id=191
                     AND messages.id= message_tag.message_id
4

3 回答 3

2

这是我为什么不喜欢使用,符号的一个例子。

你不message_tag涉及tags。相反,您将每个消息标签连接到每隔一行。

这就是你所拥有的...

SELECT
  messages.message_poster,
  messages.message
FROM
  messages
INNER JOIN
  message_tag
    ON messages.id= message_tag.message_id
CROSS JOIN
  tags
WHERE
  message_tag.tag_id=191

这是你应该拥有的...

SELECT
  messages.message_poster,
  messages.message
FROM
  messages
INNER JOIN
  message_tag
    ON messages.id = message_tag.message_id
INNER JOIN
  tags
    ON tags.id     = message_tag.tag_id
WHERE
  message_tag.tag_id = 191

(或者,根本不加入,tags在这种情况下你没有使用它。虽然我很欣赏这可能是实际查询的简化版本。)

ANSI-92用符号来混淆它要困难得多。

于 2012-06-20T15:09:06.597 回答
0

我认为您缺少 2 个表之间的连接条件,也许tagsmessage_tag

于 2012-06-20T15:08:20.907 回答
0

在 message_tag 上创建一个二维索引(在两个字段上),并将 WHERE 重写为

WHERE 
    message_tag.tag_id=191 AND 
    message_tag.message_id = messages.id
于 2012-06-20T15:06:20.933 回答