mysql - 复杂查询策略

标签 mysql

我正在开发一个数据库,我需要创建一个查询。数据库将保存来自具有主表“警报”的一般警报的信息,该主表以下列方式将所有其他表信息与该警报相关联:

  • 警报表包含以下列:analyzer_id、create_time_id (...) 和 classification_id。 (警报与其余表之间的 1 对 n 关系)

  • alert_has_source 表包含以下列:alert_id 和 source_id。 (警报和源之间的 n 到 m 关系)

  • alert_has_targets 包含以下列:alert_id 和 target_id。 (警报和目标之间的 n 到 m 关系)

enter image description here

我是 mysql 的业余爱好者,所以我不确定数据库是否设计良好,这是表达信息的方式。

我需要从表分析器、分类、create_time、源(带有节点和地址)、目标(带有节点和地址)中查询一些列,这些列需要通过表 classification.ident = "log"进行过滤。

1) 我应该在数据库中创建一个 View 并为它提供查询吗?效果好吗?

2)关于查询应该使用多选还是内连接?

3) 我只需要数据库的一部分,如何优化搜索?

最佳答案

您的问题并不像您需要的结果集那样具体。这使得很难具体回答。

尽管如此,这是一次尝试。

1) Should I create a view in the database and provide it with the query?

你可以做到。这是封装复杂查询的便捷方式。首先让查询正常工作,然后从中生成 View 。

Does that perform well?

在 MySQL 中, View 的性能通常与它们的单一查询等效项非常相似。其他数据库(例如 PostgreSQL、Oracle)对 View 进行了优化。

2) Regarding the query should I use multiple selects or the inner join?

如果您需要一个特定的结果集——一个特定的虚拟表,每个有趣的项目一行——由您的表组成,您应该使用 JOINing 表的策略。如果您需要来自不同表的一堆松散相关的数据点,您可以分别选择这些数据点。

INNER JOIN 是一种 JOIN。有时您可能需要 LEFT JOIN。当表 a 包含表 b 中缺少的行时,a LEFT JOIN b 可能会更好地为您服务。 INNER JOIN 抑制结果集中的行,除非它们出现在联接的两侧。

3) How to optimize the search due to the fact that I only need some part of the database?

这就是 SQL 中索引的用途。你可以在这里读到它。 http://use-the-index-luke.com/

关于mysql - 复杂查询策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33870083/

相关文章:

java - 如何将 Angular 6 数据表与服务器端的可观察数据一起使用(MySQL&Java&Springboot&hibernate)或如何将可观察数据转换为数组?

mysql - 如何显示简单MySQL 1对多表的动态列?

mysql - ruby 的SQL错误

mysql - 即使安装了节点模块,Lambda 函数也失败并提示 "mysql"命令未找到

mysql - 两列都可以为空时的比较

mysql - 创建自定义论坛,帮助构建查询以计算类别中的帖子等

mysql - Magento:带锁的自定义 MySQL 查询不起作用

mysql - 需要 MySQL 加入类似

php - 如何获取新插入行的id?

mysql - mysql中的逗号分隔值和通配符