重复的OR条件会降低性能,您可以尝试降低性能,避免为此使用多个OR子句
如果您可以存储对(value1,value2),(value3,value4),... (valuen,valuen+1)
在临时table temp_table colA,colB
上,且索引为colA,colB
您可以尝试通过内部联接使用delte
对于sybase,删除连接的sintax应该为
DELETE
FROM [table name]
FROM [table name],temp_table
WHERE [table name].col1 = temp_table.colA
AND [table name].col2 = temp_table.colB
确保在[表名](col1,col2)上也有一个复合索引
,
-
首先,您在自己的条件下使用OR
,innodb将不会使用
索引。
-
第二,更多索引将减慢删除命令的执行速度
时间。
-
第三,您的表太大,需要通过拆分对其进行优化
按日期或其他符号。
因此,如果要使用索引,可能是需要通过拆分或条件几次运行delete命令,这将使用索引。
PS:使用复合索引(col1,col2)会更快。
如果您想要的记录不多。
请参阅:http://dev.mysql.com/doc/refman/5.0/en/delete.html
如果要从大型表中删除许多行,则可能超出InnoDB表的锁定表大小。为避免此问题,或者只是为了最小化表保持锁定的时间,以下策略(根本不使用DELETE)可能会有所帮助:
# Select the rows not to be deleted into an empty table that has the same structure as the original table:
INSERT INTO t_copy SELECT * FROM t WHERE ... ;
# Use RENAME TABLE to atomically move the original table out of the way and rename the copy to the original name:
RENAME TABLE t TO t_old,t_copy TO t;
# Drop the original table:
DROP TABLE t_old;
,
删除操作很昂贵。 15分钟内10万行大约是每秒111行。根据许多因素,这不一定很糟糕,您在问题中没有对此进行解释:
- 系统上有什么负载?
- 其他查询是否干扰删除所需的锁?
- 表上有多少个索引?
- 该表是否有外键引用?
- 是否有
delete
个触发器?
delete
是一项昂贵的操作。除了delete
所需的特定工作外,还需要锁定行/页,并需要记录结果。
尚不清楚查找行是导致您认为性能问题的原因。查找行将对索引有所帮助。当然,可能是 的问题。但这并不明显。
在许多数据库中,大规模删除的速度非常慢,以至于在没有所需行的情况下重新创建表的速度更快。也就是说,此序列可以更快:
- 创建一个新表,使用
where
过滤行。
- 截断原始表(首先创建备份副本!)。
- 将数据重新插入表中。
本文链接:https://www.f2er.com/3161038.html