mysql删除原理及用法
通过终端help delete
,查询delete的用法及注意事项
1 | mysql> help delete; |
DELETE 语句支持以下修饰符:
- LOW_PRIORITY,如果您指定LOW_PRIORITY,则DELETE的执行被延迟,直到没有其它客户端读取本表时再执行。
- QUICK,对于MyISAM表,如果您使用QUICK关键词,则在删除过程中,存储引擎不会合并索引端结点,这样可 以加快部分种类的删除操作的速度。
- IGNORE,在删除行的过程中,IGNORE关键词会使MySQL忽略所有的错误。
DELETE 注意事项
- DELETE删除数据时,如果没有加WHERE条件,则全部删除表数据,相当于
truncate table
。- 删除数据时调用
ROW_COUNT()
函数返回删除数据。- 删除时加入
ORDER BY
,则删除顺序被指定。- 删除时加入
LIMIT
,则删除数量被指定。- 多表删除数据时,
ORDER BY
和LIMIT
不能使用。- 当删除表数据时,不能同时对表做子查询。
- 删除表数据需要
DELETE
权限,如果加了WHERE
条件,也需要SELECT
权限。- 在一个事务中或者表加锁时,
TRUNCATE TABLE
不能使用但是DELETE
能使用。
删除大量数据注意事项
在生产环境中,删除大量数据,会消耗太多的IO资源,会造成一些不良现象主从延时、数据文件无法收缩、锁表等。做大量数据删除时,请注意以下事项:
- 批量删除,这样往往可以工作得更快,你可能需要在每次批量删除前sleep一段时间,控制删除的频率,这样的目的是减少对生产系统的IO冲击,把符合平均分布,避免从库滞后太多;
- 按照主键的序列分批分次,或者基于时间分批分次。
- 基于硬件的性能,每批删除的记录数,可以选择几百到几千到几万的数据量,但不要太大,MySQL很难同时处理好大事务和随机小事务;
- 如果要删除大部分数据,那么可以考虑的方式是,创建一个新表,insert要保留的数据,然后切换表;
- 对于大表(InnoDB)删除大量数据,如果是一个大的事务,中止删除数据的操作可能需要几倍的时间用于回滚,这样会导致严重的IO瓶颈,而批量删除可以让我们的回滚恢复要快得多。
- 需要留意空间的释放,选择独立表空间会更有利于释放空间。
删除实战
通过写存储过程的方式去删除数据,附上代码
1 | DELIMITER // |
通过mysql命令行执行call delete_large()
,如果执行时间过久可以创建event执行
mysql命令行查询存储过程的方法
1 | mysql> show procedure status\G |
查看存储过程创建语句
1 | show create procedure delete_large\G |