是否可以使用 MySQL 的模型/模式进行复杂查询?

Posted

技术标签:

【中文标题】是否可以使用 MySQL 的模型/模式进行复杂查询?【英文标题】:Is it possible to use model/Schema of a MySQL for complex queries? 【发布时间】:2012-08-24 21:19:34 【问题描述】:

我所说的复杂查询是指您必须使用至少 2 个连接的查询。假设我已经构建了数据库的模式/模型。现在假设我有users.user_id = 5,我要求logins.lastlogingroups.groupnamehistory.user_weight。我不会编写任何连接 SQL 语句,所有这些语句都将在后台通过数据库的模式/模型进行连接。 mysql 可以吗?

【问题讨论】:

使用视图:dev.mysql.com/doc/refman/5.5/en/create-view.html @Omesh,但是您必须将查询写入视图。为什么干脆不使用它呢?和正常的一样。 【参考方案1】:

是的,views 是可能的

http://dev.mysql.com/doc/refman/5.5/en/views.html

【讨论】:

不!首先,它处理所有数据,即使结果将是一行。当你有 300000 行时,a** 很痛苦;它说“执行时间限制”。 @george “处理所有数据”是什么意思。正确索引的基表将通过进行全表扫描来确保对视图的查询具有良好的性能,这与视图外的 JOIN 相同。您实际上是在问 MySQL 是否可以“预先加入”数据,比如 Oracle 物化视图? @BrankoDimitrijevic,是的,我认为,由 MySQL 本身“预先加入”。我不知道甲骨文。【参考方案2】:

如果您不喜欢 Views 的想法 - 顺便说一句,这是 理想的 - 您可以随时模仿 Oracle-materialized views Branko 的做法:

在您要加入的每个表上创建INSERTDELETEUPDATE 触发器usersloginsgroupshistory;这将更新一个名为lgh(示例)的新第五张表

因此,您将这个新的lgh 表用于上面想要的查询。与实际视图相比,它可能会减少扫描的行数,但现在每次原始 4 个表中的任何一个表中的数据更改时都会产生开销。根据您使用这个新 lgh 表与更新其他 4 个表的频率,您可能会看到一些性能提升。

免责声明:

我不容忍这种解决方法,它只是针对您的问题的替代建议。 您确实应该考虑为原来的 4 个表添加更多索引,甚至可能为您在该连接查询中使用的每一列添加更多索引。 这可能类似于“缓存”...不完全是。

【讨论】:

以上是关于是否可以使用 MySQL 的模型/模式进行复杂查询?的主要内容,如果未能解决你的问题,请参考以下文章

使用原始 SQL 查询绑定复杂模型实体?

使用 Laravel Query Builder 进行复杂的 MySQL 内连接查询

Django:使用嵌套模型进行查询的复杂排序

使用 Java 和 SQL 查询维度模型或模式

MySQL-注释-Navicat基本使用-复杂查询练习题-解题思路-pymysql操作数据库-SQL注入-05

存储库模式 - 如何正确处理 JOIN 和复杂查询?