MySQL中的速度不比不相等的快吗?
我试图找出是否有一种更有效的方法来为MySQL 5.5编写存储过程。本质上,存储过程将截断我创建的所有表中的数据,只有少数表例外。我试图通过执行以下命令来实现这一点MySQL中的速度不比不相等的快吗?,mysql,sql,stored-procedures,Mysql,Sql,Stored Procedures,我试图找出是否有一种更有效的方法来为MySQL 5.5编写存储过程。本质上,存储过程将截断我创建的所有表中的数据,只有少数表例外。我试图通过执行以下命令来实现这一点 create procedure truncate_tables() begin declare tab_name varchar(64); declare done tinyint unsigned default 0; declare table_cur cursor for select t.table_name f
create procedure truncate_tables()
begin
declare tab_name varchar(64);
declare done tinyint unsigned default 0;
declare table_cur cursor for select t.table_name
from
information_schema.schemata s
inner join information_schema.tables t on s.schema_name = t.table_schema
where
s.schema_name = database()
and t.table_type = 'BASE TABLE'
and t.table_name not like 'DATABASE%'
and t.table_name != ‘my_table_1’
and t.table_name != ‘my_table_2’
and t.table_name != ‘my_table_3’
…
and t.table_name != ‘my_table_n-1’
and t.table_name != ‘my_table_n’;
declare continue handler for not found set done = 1;
open table_cur;
repeat
fetch table_cur into tab_name;
set @cmd = concat('truncate table ', tab_name);
prepare stmt from @cmd;
execute stmt;
until done end repeat;
close table_cur;
end
当我探索如何加快这一过程时,我是否应该用一个“notin(list)”子句替换我众多的不平等子句?不确定在MySQL中哪个执行速度更快,或者是否还有其他效率可以提高。
不在
中是编写代码的更清晰的方法,它使代码更易于维护(更容易添加新表名,更容易理解)
您使用的是可能没有那么大的系统表。您正在执行的联接可能比where
子句的开销更大。而且,您正在使用光标访问数据。对于where
子句上的一些微优化,性能上的差异可能可以忽略不计
使用不在
中
而且,如果您真的担心,请测试这两种方法并选择一种更快的方法。要回答问题标题中的问题,不,就生成的执行计划而言,性能没有差异。这两种形式是等价的。(在实际解析语句时,可能会有微小的性能差异,但这是无法衡量的 我预计大部分时间将用于实际执行单个TRUNCATE语句
您不需要连接到
schemata
表,您可以引用谓词中tables
表中的table\u schema
列:
SELECT t.table_name
FROM information_schema.tables t
WHERE t.table_schema = DATABASE()
AND t.table_type = 'BASE TABLE'
AND ...
谓词
foo NOT IN ('a','b','c')
相当于
(foo != 'a' AND foo != 'b' AND foo != 'c')
执行计划没有区别;在这种情况下,
notin
只是避免了我们必须重复对foo
的引用,使语句更易于阅读、理解和维护。对schemata
表的引用是不必要的;通过使用等价的谓词r可以避免连接操作参考表格
表格中的表格\u架构
列。当您说“您正在使用光标访问数据”,有那么糟糕吗?有没有更好的方法来访问数据?@Dave…您有一个复杂的语句,其中包含连接
和游标
的开销。然后您将使用动态SQL截断表。where
子句中这两个方法的开销差异非常小n比较。您的性能集中在错误的位置。我将删除不必要的join子句,但我要问的是您提到了游标的存在。您提到这一点是因为它是一个可以改进的领域吗?如果是,如何改进?