標籤:辛星 mysql 資料片段 效能 資料
對於mysql中的資料片段,其實和我們刪除資料是息息相關的,刪除資料的時候必然會在資料檔案中造成不連續的空白空間,對於少量的資料的刪除,並不會產生多少的空白空間。如果在一段時間內的大量的刪除操作,會使得這種留空的空間變得比儲存列表內容所使用的空間更大。可能有人會說,我們向資料庫中插入資料的時候,會不會在這些空白空間中插入資料呢?答案是會的。但是,它會造成一個後果,那就是資料的儲存位置不連續,以及實體儲存體順序與理論上的儲存順序不相同,這就比較麻煩了。
按照資料片段的大小來分,可以分為單行資料片段和多行資料片段。其實不僅僅會產生資料片段,如果加了索引,還會產生索引片段,這樣會造成順序的紊亂。由於MySQL的引擎的內部實現機制不同,在資料片段的處理上也會不同。
對於MyISAM來說,因為它的索引和資料以及表結構分為三個檔案來儲存,因此optimize可以整理資料檔案,並且重新排序,這樣因為資料片段產生的效能問題會減少很多,直接使用【optimize table 表名】即可,但是此時也應該注意一些問題,由於該操作會鎖住表,所以我們盡量定期整理一下片段,在訪問量小的時候來做這件事。我們可以查看information_schema資料庫下的tables中的free_data欄位即可,如果該欄位不為0,則產生了資料片段,看下面操作:
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql> use information_schema;Database changedmysql> select data_free from tables;+-----------+| data_free |+-----------+| 0 || 0 |...中間省略部分資料| 0 || 72 || 0 || 0 |+-----------+162 rows in set (0.06 sec)mysql>
這裡我們是查看所有的表中的資料片段,如果我們想單獨看某一個表的資料片段,看下面操作:
第一步,我們先建立一個庫和一個表,並向其中插入四條資料:
mysql> create database xinxing;Query OK, 1 row affected (0.16 sec)mysql> use xinxing;Database changedmysql>mysql> create table xin (c char(40)) engine = myisam;Query OK, 0 rows affected (0.06 sec)mysql>mysql> insert into xin values('xiaohei'),('xiaoqian'), -> ('xiaolin'),('xiaonan');Query OK, 4 rows affected (0.03 sec)Records: 4 Duplicates: 0 Warnings: 0
第二步,我們查看這個表的資訊:
mysql> show table status from xinxing \G*************************** 1. row *************************** Name: xin Engine: MyISAM Version: 10 Row_format: Fixed Rows: 4 Avg_row_length: 121 Data_length: 484Max_data_length: 34058472181989375 Index_length: 1024 Data_free: 0 Auto_increment: NULL Create_time: 2014-08-25 13:19:02 Update_time: 2014-08-25 13:19:35 Check_time: NULL Collation: utf8_general_ci Checksum: NULL Create_options: Comment:1 row in set (0.00 sec)
我們發現這裡面並沒有資料片段,都是非常嚴密的。
第三步,我們刪除一條資料:
mysql> delete from xin where c = 'xiaolin';Query OK, 1 row affected (0.00 sec)
第四步,我們再次查看,探索資料片段產生了:
mysql> show table status from xinxing \G*************************** 1. row *************************** Name: xin Engine: MyISAM Version: 10 Row_format: Fixed Rows: 3 Avg_row_length: 121 Data_length: 484Max_data_length: 34058472181989375 Index_length: 1024 Data_free: 121 Auto_increment: NULL Create_time: 2014-08-25 13:19:02 Update_time: 2014-08-25 13:20:15 Check_time: NULL Collation: utf8_general_ci Checksum: NULL Create_options: Comment:1 row in set (0.00 sec)
我們發現上面的data_free欄位為121,也就是產生了121位元組的空白空間。
大家注意,我們這裡只是刪除了一條資料,如果刪除n條資料,那這些片段就很影響效能了,至於它的解決辦法,我們上面也提到了,這裡就不再提了。我是辛星,期待您的關注。
辛星淺談mysql中的資料片段以及引擎為MyISAM下的操作