MySQL:如何获得视图的模块化,但优化更长的代码?

Posted

技术标签:

【中文标题】MySQL:如何获得视图的模块化,但优化更长的代码?【英文标题】:MySQL: How to get the modularity of views, but the optimization of longer code? 【发布时间】:2016-09-01 21:16:47 【问题描述】:

mysql 和 sqlite3 中,1) 使用嵌套视图编写查询通常比从视图中复制代码并将其粘贴到更大的查询中要慢得多(来源:here,@ 987654322@,here,个人经验)。但是,2)我喜欢视图如何使 SQL 代码更短且更模块化,就像函数使代码更短且在其他语言中更模块化一样。最后,3)我很懒,我希望优化器为我完成规划连接、挑选索引和寻找效率的所有工作。我怀疑如果我想亲自动手并自己计划连接,我可以编写模块化且快速的查询,但我不想这样做。

因此,1) 速度、2) 模块化和3) 易用性,我似乎只能拥有两个。 我怎样才能同时拥有这三个?

【问题讨论】:

MySQL 5.7 在优化VIEWs 方面做得“更好”。你用的是什么版本? 请注意,将视图粘贴到查询中会导致 子查询;您的 SQLite 示例使用两个完全不同的查询。 SQLite documents in excruciating details 在什么情况下无法优化子查询/视图。 @RickJames:我使用的是 5.7。我还注意到我的一个消息来源 (this guy) 发表于 2007 年,在 VIEWS 在 5.0 中首次成为 MySQL 的一部分之后不久,在 5.1 发布之前。所以你说的很有道理。 @CL :带有子查询的查询和两个不同的查询之间的区别让我无法理解,直到您指出来,所以谢谢。我想我需要阅读您提到的文档。 【参考方案1】:

在 MySQL 中,查询计划器通常以相同的方式处理从视图构造的查询和从嵌套子查询构造的查询。 MySQL 与其他一些 RDMS 品牌和模型不同,它没有内置的物化视图。

但是,如果您希望同时保证速度、模块化和易用性这三个方面,您将不得不切换到另一个 RDMS。 Oracle 会做一些你想做的事情,但要让它发挥作用,你必须聘请 DBA 并支付高额许可费用。

通用表表达式是模块化代码的另一种方法。 PostgreSQL handles those;商业 RDMS 也是如此。

【讨论】:

感谢 CL 的观点,我意识到我的部分问题是基于对嵌套子查询的误解,但我对速度、模块化、易用性和吝啬的追求仍在继续。也许是时候让我牺牲一些轻松并了解 PostgreSQL,或者至少阅读更多 MySQL 文档。

以上是关于MySQL:如何获得视图的模块化,但优化更长的代码?的主要内容,如果未能解决你的问题,请参考以下文章

SQL 查询优化

为啥从 Spark 写入 Vertica DB 比从 Spark 写入 MySQL 需要更长的时间?

如何解析比 NSString 更长的 JSON 文件?

如何在 Powershell 中开始一个比它的父级寿命更长的后台作业?

从矢量中删除相似但更长的重复项

为啥我使用 openMP atomic 的并行代码比串行代码花费更长的时间?