当前位置: 首页 > 面试题库 >

仅在没有子行的情况下选择父行

巩镜
2023-03-14
问题内容

我有一个MySQL数据库,其中表A与表B具有一对多关系,我想选择表B中表A中没有子项的所有行。

SELECT id FROM A WHERE NOT EXISTS (SELECT * FROM B WHERE B.id=A.id)

SELECT id FROM A LEFT JOIN B ON A.id=B.id WHERE B.id IS NULL

两者似乎都很慢。是否有更快的查询来实现相同的目的?

如果这是相关的,在我的数据库中,表A大约有500,000行,表B大约有3到4百万行。

编辑: 对于我的数据库中的实际表,解释给我:

+----+--------------------+------------------+-------+---------------+---------------------------+---------+------+---------+--------------------------+
| id | select_type        | table            | type  | possible_keys | key                       | key_len | ref  | rows    | Extra                    |
+----+--------------------+------------------+-------+---------------+---------------------------+---------+------+---------+--------------------------+
|  1 | PRIMARY            | frontend_form471 | index | NULL          | frontend_form471_61a633e8 | 32      | NULL |  671927 | Using where; Using index |
|  2 | DEPENDENT SUBQUERY | SchoolData       | index | PRIMARY       | PRIMARY                   | 49      | NULL | 3121110 | Using where; Using index |
+----+--------------------+------------------+-------+---------------+---------------------------+---------+------+---------+--------------------------+

为了

select number from frontend_form471 where not exists (select * from SchoolData where SchoolData.`f471 Application Number`=frontend_form471.number)

+----+-------------+------------------+-------+---------------+---------------------------+---------+------+---------+------------------------------------------------+
| id | select_type | table            | type  | possible_keys | key                       | key_len | ref  | rows    | Extra                                          |
+----+-------------+------------------+-------+---------------+---------------------------+---------+------+---------+------------------------------------------------+
|  1 | SIMPLE      | frontend_form471 | index | NULL          | frontend_form471_61a633e8 | 32      | NULL |  671927 | Using index; Using temporary                   |
|  1 | SIMPLE      | SchoolData       | index | PRIMARY       | PRIMARY                   | 49      | NULL | 3121110 | Using where; Using index; Not exists; Distinct |
+----+-------------+------------------+-------+---------------+---------------------------+---------+------+---------+------------------------------------------------+

为了

select distinct number from frontend_form471 left join SchoolData on frontend_form471.number=SchoolData.`f471 Application Number` where SchoolData.`f471 Application Number` is NULL

在我的情况下,frontend_form471是表A,SchoolData是表B

Edit2: 在我数据库的表B(SchoolData)中,id是两部分主键的第一部分,因此已对其进行了索引,并且B中仍然存在多个具有相同id的条目。


问题答案:
SELECT id FROM A LEFT OUTER JOIN B ON A.id=B.id WHERE B.id IS NULL

你可以这样做。外部联接应该带来一点性能,但不是很多。

新的数据库系统可能仍会优化您的查询,因此不会有任何差异。

正确的方法是缓存!如果可能,请尝试查询缓存和应用程序级缓存。

当然,您需要适当的索引。

正确地说,我的意思是在两个表上最好是一个哈希索引,因为与具有对数的任何树相比,它具有静态查找时间

尝试在查询前放置一个解释,以了解到底是什么使速度变慢了。

如果您确实需要此方法来加快速度,则可以重新构建数据结构。

您可以创建一个触发器来标记表A中的标志,表be中是否存在相应的条目。当然,这种id数据冗余,但有时值得。只是将其视为缓存。

最后一个想法:您可以尝试SELECT id FROM A WHERE id NOT IN (SELECT id FROM B)这样做可能会更快一些,因为不需要实际的连接,但是它也可能会比较慢,因为在be集合中的查找将是一次完整扫描。我不确定该如何处理,但值得一试。



 类似资料:
  • 本文向大家介绍在什么情况下选择webpack?在什么情况下选择rollup?相关面试题,主要包含被问及在什么情况下选择webpack?在什么情况下选择rollup?时的应答技巧和注意事项,需要的朋友参考一下 非要一句话区分的话 如果是用,如果是用其实界限并不是特别明显。在某些特殊情况下可以互用

  • 文档说这个库运行在GPU上。如果我功能强大的笔记本电脑没有GPU,我还能运行Deeplearning4J吗?

  • 问题内容: 因此,我有两个表格学生(PK sID)和导师(PK pID)。这个查询 提供这个结果 我正在尝试以此顺序获取不同的导师ID的列表,因此我正在寻找要生成的SQL 如果仅在SELECT子句中插入DISTINCT,我将得到意外的结果10、9、3(错误的顺序)。任何帮助,不胜感激。 问题答案:

  • 问题内容: 我正在使用这个名为Viper的配置库 在我的主要我有: 然后,我有了一个以毒蛇为参数的结构: 在我的主目录中,我有一个返回该MyConfig的函数,例如: 我收到此错误: 不知道该怎么办? 问题答案: 当您导入像 包名称(在这种情况下)将作为新标识符提供给您。您可以使用此标识符来构造合格的标识符,以引用包的导出标识符(以大写字母开头的标识符)。 程序包名称本身不能使用。出现错误的行:

  • 问题内容: 我正在尝试将新记录插入到我之前知道是唯一的表中。我试过在对象上调用save(),但是这样做在执行任何INSERT之前会执行一堆SELECT语句,我不想​​这样做,因为我知道对象已经是唯一的。 我为每个交易都打开了一个新会话,可以看到这是一个问题,但这是我的工作范围的限制。有什么办法可以强迫Hibernate在插入之前不做任何选择? 问题答案: 您可以使用persist()方法而不是sa

  • 问题内容: 我不知道在不知道父元素的情况下选择第n个元素,最后一个元素或第一个元素的方法。存在,但仅针对儿童,例如: 选择“两个”段落,然后选择“一个”段落。但是,当我拥有动态代码却不知道父级名称是什么,甚至不知道父级实际是什么(可能是div,span,anchor,ul等)时,该怎么办? 例如: 如何在这里选择第二段?(我无法选择,因为我真的不知道它是什么元素(这只是一个假设名称)。 为何会出现