【问题标题】:Alternate of joining multiple tables in mysql在mysql中加入多个表的替代方法
【发布时间】:2013-12-06 12:21:00
【问题描述】:

我正在编写一个查询,我需要内联超过 16 个表。 查询执行时间过长,我还在各个列上添加了索引,但仍然面临同样的问题。

任何人都可以为此提出最佳替代方案吗?

我有一种 CMS,其中我们有与产品相关的不同类型的信息 比如类别、类别与产品映射、项目类型、类型映射、语言、语言映射等...

我的表已完全规范化,数据库架构设计没有任何问题。

【问题讨论】:

  • 你知道en.wikipedia.org/wiki/Denormalization的想法吗?
  • 开发一个不需要 16 个连接的新模式? (很可能)没有比 JOINS 更快的替代方法。 (事实上​​,JOINS 通常被用作 EXISTS、NOT EXISTS、IN、NOT IN 和子查询的更快替代)。除非你要分享你的架构,以及你想要做什么,否则每个人都在猜测。
  • 我怀疑 JOIN 是你的问题。
  • 另外,与前面的EXPLAIN 共享运行查询的结果,以及架构详细信息。

标签: mysql


【解决方案1】:

如果您的数据库布局要求您在获得所需数据之前执行 16 次连接,那么问题不在于连接,而是数据库布局。尝试重新考虑数据库,使用非规范化步骤,但在某个点停止。根据您的数据库的使用情况,您不应该过度规范化。 如果重做数据库不是一种选择,那么我会研究物化视图或中间表。将部分数据放在一个新视图或表中,并在查询中使用该表。该表当然需要定期更新,具体取决于数据所需的“新鲜度”。如果您使用视图,则在请求时收集数据,但这当然会带来额外的性能成本。

【讨论】:

  • 我的表很沮丧,所有的表都被分成小部分和映射,现在获取数据需要连接所有这些小部分,这就产生了问题。
  • 确实,这就是我所说的及时停止的意思 :-) 根据您的需要,您需要反规范化到第 3 步或第 4 步。第 5 步几乎是严格意义上的理论。但很大程度上取决于您的数据库的使用和您的需求。
【解决方案2】:

我已经读到不建议加入超过七个表。

我对您的架构一无所知,但我想知道 VIEWs 是否可以帮助您。

【讨论】:

  • 您能否为您的两个语句提供参考 - 不加入超过 7 个表以及视图如何提供​​帮助?我从未见过查询优化器处理复杂查询的方式与将一些 JOIN 抽象为视图有什么不同。
【解决方案3】:

我认为除了 JOINS 之外没有其他选择。但根据您的要求,您可以在某些情况下使用 LEFT JOIN 而不是 INNER JOIN。

您也可以设置 EXISTS 和 NOT EXISTS 的条件,但这只是猜测,无需查看您的架构

【讨论】:

  • 你是说LEFT JOIN 会比INNER JOIN 表现更好吗?
  • @AgRizzo:- 不,我是说他们会表现得更好,我只是说 OP 在某些情况下也可以使用 LEFT JOINS。我错过了什么吗?
  • OP 正在寻找替代方案,因为他们的查询太慢了。
  • @AgRizzo:- 我不认为有任何替代 JOINS。但是我建议使用 LEFT JOINS,因为我认为它可以帮助 OP。但是 JOIN 的替代品看起来很难找到 ;)
【解决方案4】:

我认为你应该在表之间绘制简单的连接,而不是开始构建查询,第一次可能看起来很乱,但从绘制简单的连接开始是一个好的开始

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-04
    • 1970-01-01
    • 2010-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多