保存查询和优化数据库

Posted

技术标签:

【中文标题】保存查询和优化数据库【英文标题】:Saving queries and optimizing a database 【发布时间】:2012-02-12 09:37:37 【问题描述】:

我正在创建一个脚本,旨在通过选择一个类别、子类别和另一个子类别或选择全部来查询帖子列表。

问题是,当我想显示“所有”帖子时,我需要为每个帖子创建 3 个查询(将类别编号转换为名称)。

有没有办法让它更优化?

表格结构:

帖子:

id (int) main_cat(主要类别)(int) sub_cat(子类别)(int) sub_sub_cat(子到子)(int) 描述(varchar)

main_cat:

id (int) 名称(varchar)

sub_cat:

id (int) relation (int)(main_cat 的 id) 名称(varchar)

sub_sub_cat:

id (int) relation (int)(sub_cat 的 id) 名称(varchar)

提前致谢。

【问题讨论】:

您是否尝试在查询中使用联接 不确定加入? (安静的新手) 到目前为止你有什么? 目前我知道的唯一方法是查询每个帖子,然后获取类别编号并查询他们的表以获取名称。 如果我认为您想要查询以获取具有相应类别名称的帖子名称,我是否理解您的错误? 【参考方案1】:

我将从阅读 JOIN 开始解决您的问题:http://mysqljoin.com/joins/inner-join-tutorial/

一旦你理解了这个概念,你的问题就会自行解决。

不提供任何解决方案代码,因为这个问题看起来像是一个家庭作业。

【讨论】:

我还建议在LEFT JOIN上阅读一些内容 是的,这是作者需要理解的第二件事 -)【参考方案2】:

而是获取所有类别名称、id 并将它们存储到一个数组中。像 [id]=>category_name。 和其他查询来获取父子,使用连接。

【讨论】:

【参考方案3】:

类似:

SELECT posts.description, main_cat.name AS cat_name, sub_cat.name AS sub_name, sub_sub_cat.name AS sub_sub_name FROM posts LEFT JOIN main_cat ON main_cat.id=posts.main_cat LEFT JOIN sub_cat ON sub_cat.id=posts.sub_cat LEFT JOIN sub_sub_cat ON sub_sub_cat.id=posts.sub_sub_cat

会这样做,但这是未经测试的 - 如果有用,请将其标记为已接受 - 38% 的接受率不会为您提供太多帮助!

如果您要使用数据库,了解 JOIN 和 LEFT JOIN 非常有用!

【讨论】:

我尝试解决的方法有一个问题。目前只有 1 个帖子,虽然同一个关系有 2 个子类别,但会发生两次相同的帖子,只是子类别不同 应该工作,因为它只会使用发布的帖子并加入该帖子所在的数据 - 如果您有多个类别(您没有说明),那么它不会做任何事情关于它们 - 但我会认为每个帖子都是独一无二的(否则你的帖子不是唯一的但有多个类别和子类别)。如果是这种情况,那么它要么是数据库设计,要么你需要做另一个查询,等等

以上是关于保存查询和优化数据库的主要内容,如果未能解决你的问题,请参考以下文章

数据库 - 性能优化

如何通过经纬度计算距离来优化 SQL 查询?

优化where子句中的SQL子查询

数据库理论之视图事务索引优化查询

索引优化驱动SQL优化总结

索引优化驱动SQL优化总结