gpt4 book ai didi

mysql - 多表和大数据的查询优化

转载 作者:行者123 更新时间:2023-11-29 18:43:12 25 4
gpt4 key购买 nike

我正在做一个硕士学位项目,我有一个 500GB 的 MySQL 数据库。我的项目与 StackOverflow 有关,因此它如此之大。我需要优化一个选择查询,因为它需要一分钟才能运行,而且在我看来它太慢了,尤其是我正在使用 Java 制作 GUI,仅仅等待一分钟并不是一个好主意。这是我的表格和相关信息:

表:包含 22 222 747 条记录的标签。

Tags Table

标签索引。

Tags Index

表:包含 8 117 955 条记录的链接。盖子和辅助装置上有索引。

Links Table

链接索引

Links Index

表:包含 14 401 786 条记录的答案。援助和 qid 索引。

Answers Table

答案索引

Answers Index

表格:包含 7 495 155 条记录的问题。

Questions Table

问题索引。

Questions Index

这个想法是我收集人们在答案中发布的重定向链接,我的工具会根据用户的需求推荐一些链接。用户可以指定许多标签,但为了简单起见,我们假设有 2 个标签。这是我正在使用的查询:

SELECT questions.title, links.url 
FROM questions, answers, links, tags
WHERE questions.qid = tags.qid
AND answers.qid = questions.qid
AND answers.aid = links.aid
AND (tags.tag = 'php' OR tags.tag = 'mysql')
GROUP BY tags.qid, links.url HAVING count(*) = 2;

这是上面查询的解释图片:

Explain

如果用户询问 3 个或更多标签,那么我会再添加 1 个 OR 条件,并且 count(*) = 标签数量。

我不是 MySQL 的专业人士,所以我确信可以通过一些方法来改进它。我为 qid、aid 和 tag 创建了索引,长度为 10。我希望尽可能避免更改表,除非没有办法避免。

感谢您的帮助!

最佳答案

此时您的查询必须处理 >160 万行。这可以通过标签表上的多列索引来减少:

CREATE INDEX tags2 ON tags (tags, qid);

或者替代方案(取决于哪种方式效果最好的数据,如果没有真实的数据库,我无法测试它):

CREATE INDEX tags3 ON tags (qid, tag);

许多索引的缺点是插入和更新变得更慢。为了防止这种情况发生,请删除未按照计划使用的索引。

其他可能有帮助的索引是:

CREATE INDEX ans1 ON answers(qid,aid);

或者

CREATE INDEX ans2 ON answers(aid,qid);

关于mysql - 多表和大数据的查询优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44811821/

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