物理删除
物理删除就是用
DELETE
,TRUNCATE
,DROP
语句来删除表数据
好处
物理删除是从硬盘上删除数据,释放存储空间,减小数据表的体积,对读写性能提升是有帮助的。
坏处
- 物理删除是真删除,如果误删除了重要数据,恢复起来难度较大。在恢复时需要利用binlog日志来恢复数据,这里也就不展开了。
- 物理删除会导致主键值不连续,导致在按主键id分页查询变慢。
假如我们的分页的SQL是根据主键值来分页的,如果采用了物理删除,就会导致主键值不连续,就不能使用索引来进行查询了。
SLELECT ... FROM .... WHERE id > 10000 AND id < 10020
如上的SQL语句就是采用主键值分页,来代替limit分页,在主键连续时,是采用主键自带索引,如果不连续的话,索引失效就会变慢了。如果真的无法避免出现物理删除场景,关于大数据快速分页的文章也会介绍折中方案。
什么数据不能物理删除
核心业务的数据不能删除,像用户类,商品,订单,支付记录等等,都是不能物理删除,只做状态变更。像用户我们只做注销,禁用状态,商品只做下架/无效状态,订单记录,支付记录也都是取消状态。
如何既不物理删除,又能给数据表减压
innodb引擎下,数据表在到达2000万数据后,数据表的性能会下降,这个时候,我们可以把一些比较老的数据(比如订单表),可以专门迁移到历史表,历史表可以采用TokuDB引擎,或者直接使用mongdb。最后把原来老数据删除,这样子数据表的体积降下来了。那么性能也上去了。
逻辑删除
什么是逻辑删除
逻辑删除就是给数据表加一个状态字段比如is_delete,来表示数据的有效性,在查询的时候带上这个字段的条件
SELECT ...FROM ... WHERE isdelete = 0
核心业务表必须采用逻辑删除。