[英]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_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
表示法更加困难。
在message_tag上创建一个二维索引(在两个字段上),并将WHERE重写为
WHERE
message_tag.tag_id=191 AND
message_tag.message_id = messages.id
我想你错过了两个表之间的连接条件,可能是tags
和message_tag
?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.