[英]Is NOT IN faster than inequals in MySQL?
我试图找出是否有一种更有效的方法来为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
当我探索更快的方法时,是否应该将我的众多不等式子句替换为“ NOT IN(list)”子句? 不确定哪种方法在MySQL中执行速度更快,或者是否还有其他效率需要提高。
NOT IN
是一种更清晰的代码编写方式,它使代码更具可维护性(更易于添加新表名,更易于理解)。
您正在处理的系统表可能不那么大。 您正在执行的联接可能比where
子句的开销更大。 并且,您正在使用游标访问数据。 对于where
子句的某些微优化,性能差异可能可以忽略不计。
not in
。
并且,如果您真的很担心,请测试这两种方法并选择速度更快的一种。
要在您的问题的标题中回答该问题,不,就生成的执行计划而言,性能没有差异。 这两种形式是等效的。 (在实际解析该语句时,性能可能会略有不同,但这将无法测量。
我希望大部分时间都在实际执行单个TRUNCATE语句中。
你不需要加入到schemata
的表,你可以参考table_schema
列tables
中的谓语表:
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')
执行计划没有什么区别; 在这种情况下, NOT IN
只是避免我们不得不重复对foo
的引用,并使该语句更易于阅读,理解和维护。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.