gpt4 book ai didi

sql - mysql 索引的基本优化

转载 作者:行者123 更新时间:2023-11-29 01:47:24 25 4
gpt4 key购买 nike

我有一个关于基本 mysql 数据库优化的问题。我有 3 个表,文章、标签和标签(这是一个连接表)。

Articles         Taggings             Tags
id id id
name article_id name
tag_id

我正在检索与指定标签完全匹配的文章,使用以下查询

SELECT *, COUNT(*) AS c
FROM articles AS a
JOIN taggings AS tng ON a.id = tng.article_id
JOIN tags AS t ON t.id = tng.tag_id
WHERE t.name IN ("Red","Green")
GROUP BY a.id
HAVING c = 2

这个查询很慢,所以我做了一个EXPLAIN,得到了如下结果:

alt text http://dl.dropbox.com/u/2306276/EXPLAIN%20results.png

现在,我真的不明白我在这里做什么,但我认为“type: ALL”不好,所以我想我会在标签表中为 article_id 和 tag_id 添加索引(BTREE),并且再次运行查询。 alt text http://dl.dropbox.com/u/2306276/EXPLAIN%20results%202.png好吧,在我没有受过教育的眼中,这看起来并没有好多少,行数与前一个相同,并且在两个案例中类型仍然是 ALL。

那么有人可以告诉我哪里出错了吗?索引不能帮我解决这个问题吗?

我的 Tag 表将保持相对较小,所以我认为查询应该扫描 Tag 表以查找我指定的标签,然后(通过索引)能够立即检索关联的属性,这一切都应该非常很快,显然我的想法出了问题。

谢谢

[编辑] - 杰伊的评论

我加了10k篇文章,30k个标签,6个标签,还在tag.name和taggings.tag_id上加了2个索引,查询还是跑了很久,0.5-1秒,下面是EXPLAIN。 alt text http://dl.dropbox.com/u/2306276/EXPLAIN%20results%203.png

最佳答案

因为 tags.name 是唯一真正减少结果集中行数的列,所以必须对其进行索引以使任何基于标签的搜索查询更快。

更新:尝试运行这个查询

SELECT a.*
FROM articles AS a
JOIN taggings AS tng ON a.id = tng.article_id
JOIN tags AS t ON t.id = tng.tag_id
WHERE t.name IN ("Red","Green")
GROUP BY a.id
HAVING COUNT(DISTINCT t.id) = 2

关于sql - mysql 索引的基本优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3284925/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com