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
确切地看到执行了哪种类型的联接,因此,在我的情况下(没有引用完整性和触发器),只有第二种情况是可能的?