Mysql 什么时候不使用内部联接更好?

Mysql 什么时候不使用内部联接更好?,mysql,sql-server,performance,optimization,jdbc,Mysql,Sql Server,Performance,Optimization,Jdbc,我有两张桌子: table1 (id, name, connte) table2 (id, name, connte) 它们通过表1.connte和表2.connte连接。每一个都包含100条记录 现在,如果我想从表1中删除id=20的记录及其在表2中对应的子项,是否最好执行以下操作: DELETE d1,d2 FROM table1 d1 INNER JOIN table2 d2 ON d1.connte= d2.connte WHERE d1.id = 20 select co

我有两张桌子:

table1 (id, name, connte)
table2 (id, name, connte)
它们通过表1.connte表2.connte连接。每一个都包含100条记录

现在,如果我想从表1中删除id=20的记录及其在表2中对应的子项,是否最好执行以下操作:

   DELETE d1,d2 FROM table1 d1 INNER JOIN table2 d2 ON d1.connte= d2.connte WHERE d1.id = 20
  select connte from table1 where id = 20
  --Store connte in a variable say aabc--
  delete from table2 where connte = aabc   -> execute this first
  delete from table1 where id = 20    -> execute this second
或以下各项:

   DELETE d1,d2 FROM table1 d1 INNER JOIN table2 d2 ON d1.connte= d2.connte WHERE d1.id = 20
  select connte from table1 where id = 20
  --Store connte in a variable say aabc--
  delete from table2 where connte = aabc   -> execute this first
  delete from table1 where id = 20    -> execute this second
如果我要删除的记录只有一个父项和一个子项(这里是table1.id=20),那么对整个表进行内部联接不是很昂贵吗

我是从JAVA(所以是JDBC)运行这个查询的,那么对于上面提到的条件,运行多个查询或内部联接是否更昂贵(从性能角度看)


注意:假设表没有引用完整性。因此,我不使用级联删除。

在一个查询中执行此操作可能比两个查询更快。基本上,您是在尝试自己进行优化,而不是让DBMS进行优化,通常DBMS在这方面非常擅长


此外,您可能不必担心这么小的表的删除性能。100 x 100行仍然很小,因此您的DBMS应该能够毫无问题地处理这一问题。

最好的方法是在DBMS中对两个查询运行解释计划,输出会提供I/O估计等信息。通常,只要您对从DBMS角度看什么更有效有疑问,查看查询计划和成本估算是最好的武器

SET showplan on
应该在SQL server中工作。下面是一个示例,根据DBMS的不同,您可能需要稍微不同的语法。I/O成本估算可能是您最关心的

对于MySQL,看起来您可以使用

EXPLAIN SELECT * FROM some_table
关于使用Explain分析查询

一般来说,Oleksi是正确的;大多数优化器在这方面都很在行,手动创建临时表不会给您带来太多好处。很多时候,优化器的查询计划将涉及创建临时表


对于delete查询,确保速度的一个重要因素是delete子句使用索引参数,因此不会导致全表扫描。Explain/Showplan将告诉您查询正在进行的扫描类型以及使用的索引。您通常希望避免全表扫描。

在Sql Server中,不能在一个delete语句中删除两个表(没有触发器或级联删除)Hmm..好的,但当我有十万或一百万条记录时会怎么样?对于我提到的情况,哪种方法更好?我仍然建议让DBMS来处理它。它比您可能更了解如何进行这些优化。有什么方法可以让我知道内部连接是如何工作的吗?连接两个各有一百万条记录的表不是需要时间吗?(即使在使用ON子句进行筛选之后,也有可能会有很多记录要加入)@Harke,如果你要删除数百万条记录,你还是要分批删除。如果索引正确,连接会很快。DBMS通常选择不产生大量中间结果记录的方式进行连接。正如在其他答案中提到的,您可以通过使用
showplan
确切地看到执行了哪种类型的联接,因此,在我的情况下(没有引用完整性和触发器),只有第二种情况是可能的?