記得在大學時學計算機時老師就告訴我delete刪除記錄只是給數據庫中的記錄加一個刪除標識了,這樣數據庫空間並非減小了,當時沒想這麼多,昨天發現一個數據庫利用delete 刪除以後容量沒變,後來百度了一下發現了下面一站長分享的文件,寫得很是的不錯,整理一下給各位參考。
今天空間商告訴我數據庫空間滿了,檢查了一下,發現網站用戶行爲記錄數據表居然佔了20多MB。積累了半年了,該刪除釋放一下空間了。果斷delete以後發現數據庫空間居然沒少,雖然數據記錄數是零。php
原來這是由於刪除操做後在數據文件中留下碎片所致。DELETE只是將數據標識位刪除,並無整理數據文件,當插入新數據後,會再次使用這些被置爲刪除標識的記錄空間。另外實際操做過程當中還發現這個問題還存在兩種狀況。mysql
(1)當DELETE後面跟條件的時候,則就會出現這個問題。如:sql
delete from table_name where 條件數據庫
刪除數據後,數據表佔用的空間大小不會變。ide
(2)不跟條件直接delete的時候。如:優化
delete from table_name網站
清除了數據,同時數據表的空間也會變爲0。it
這就存在了一個問題,在網站的實際運行過程當中。常常會存在這樣的附帶條件刪除數據的操做行爲。天長日久,這不就在數據庫中浪費了不少的空間嗎。這個時候咱們該使用 OPTIMIZE TABLE 指令對錶進行優化了。table
如何使用 OPTIMIZE 以及在何時該使用 OPTIMIZE 指令呢?class
命令語法:OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ...
最簡單的:optimize table phpernote_article;
若是您已經刪除了表的一大部分,或者若是您已經對含有可變長度行的表(含有VARCHAR, BLOB或TEXT列的表)進行了不少更改,則應使用 OPTIMIZE TABLE。被刪除的記錄被保持在連接清單中,後續的INSERT操做會從新使用舊的記錄位置。您可使用OPTIMIZE TABLE來從新 利用未使用的空間,並整理數據文件的碎片。
在多數的設置中,您根本不須要運行OPTIMIZE TABLE。即便您對可變長度的行進行了大量的更新,您也不須要常常運行,每週一次或每個月一次便可,只對特定的表運行。
OPTIMIZE TABLE只對MyISAM, BDB和InnoDB表起做用。
注意,在OPTIMIZE TABLE運行過程當中,MySQL會鎖定表。所以,這個操做必定要在網站訪問量較少的時間段進行。
TRUNCATE
其語法結構爲:
TRUNCATE [TABLE] tbl_name
這裏簡單的給出個示例,
我想刪除 friends 表中全部的記錄,可使用以下語句:
truncate table friends;
delete的效果有點像將mysql表中全部記錄一條一條刪除到刪完,而truncate至關於保留mysql表的結構,從新建立了這個表,全部的狀態都至關於新表,這樣空間就減下來了。
好了,固然對於咱們網站不可能使用truncate table來清除了,因這樣以後全部數據都丟失了,這樣確定是不合理的清除了,咱們必須使用delete來刪除,而後再來修復優化表了哦。