加入收藏 | 设为首页 | 会员中心 | 我要投稿 核心网 (https://www.hxwgxz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

MySQL删除操作其实是假删除

发布时间:2019-05-30 01:50:24 所属栏目:编程 来源:谭小谭啊
导读:在 InnoDB 中,你的 delete 操作,并不会真的把数据删除,mysql 实际上只是给删除的数据打了个标记,标记为删除,因此你使用 delete 删除表中的数据,表文件在磁盘上所占空间不会变小,我们这里暂且称之为假删除。 上面这个是结论,我们可以通过一个例子来

所以你想想,如果一个表上存在大量的数据空洞,原本只需一个数据页就保存的数据,由于被很多空洞占用了空间,不得不需要增加其他的数据页来保存数据,相应的,mysql 在查询相同数据的时候,就不得不增加磁盘 IO 操作,从而影响查询速度。

其实不仅仅是删除操作会造成数据空洞,插入和更新同样也会造成空洞,这里就不细说了,你知道就行。

因此,一个数据表在经过大量频繁的增删改之后,难免会产生数据空洞,浪费空间并影响查询效率,通常在生产环境中会直接表现为原本很快的查询会变得越来越慢。

对于这种情况,我们通常可以使用下面这个命令就能解决数据空洞问题。

  1. optimize table t 

这个命令的原理就是重建表,就是建立一个临时表 B,然后把表 A(存在数据空洞的表) 中的所有数据查询出来,接着把数据全部重新插入到临时表 B 中,最后再用临时表 B 替换表 A 即可,这就是重建表的过程。

我们再来试验一下,看看效果。

  1. mysql> optimize table t; 
  2. +--------+----------+----------+-------------------------------------------------------------------+ 
  3. | Table  | Op       | Msg_type | Msg_text                                                          | 
  4. +--------+----------+----------+-------------------------------------------------------------------+ 
  5. | test.t | optimize | note     | Table does not support optimize, doing recreate + analyze instead | 
  6. | test.t | optimize | status   | OK                                                                | 
  7. +--------+----------+----------+-------------------------------------------------------------------+ 
  8. 2 rows in set (0.39 sec) 
  9.  
  10. mysql> use information_schema; 
  11. Reading table information for completion of table and column names 
  12. You can turn off this feature to get a quicker startup with -A 
  13.  
  14. Database changed 
  15. mysql> select concat(round(sum(DATA_LENGTH/1024/1024),2),'M') from tables where table_schema='test' AND table_name='t'; 
  16. +-------------------------------------------------+ 
  17. | concat(round(sum(DATA_LENGTH/1024/1024),2),'M') | 
  18. +-------------------------------------------------+ 
  19. | 0.02M                                           | 
  20. +-------------------------------------------------+ 
  21. 1 row in set (0.00 sec) 

可以看到表文件大小已经变成 0.02M了,说明表空间被释放了,这个 0.02M 应该是定义表结构文件的大小了。

(编辑:核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读