Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL中的速度不比不相等的快吗?_Mysql_Sql_Stored Procedures - Fatal编程技术网

MySQL中的速度不比不相等的快吗?

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

我试图找出是否有一种更有效的方法来为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
 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子句,但我要问的是您提到了游标的存在。您提到这一点是因为它是一个可以改进的领域吗?如果是,如何改进?