繁体   English   中英

MySQL中的查询优化

[英]Query optimization in MySQL

首先,我不得不说这个话题是非常常见的话题。 我已经研究了所有相关主题,但我找不到答案。 我有三张桌子。 消息表有300.000,标签表有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

而这就是为什么我不喜欢使用的例子,表示法。

您没有将message_tagtags相关联。 相反,您将每个消息标记加入到每个其他行。

这就是你拥有的......

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表示法更加困难。

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

WHERE 
    message_tag.tag_id=191 AND 
    message_tag.message_id = messages.id

我想你错过了两个表之间的连接条件,可能是tagsmessage_tag

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM