辛星淺談mysql中的資料片段以及引擎為MyISAM下的操作,

來源:互聯網
上載者:User

辛星淺談mysql中的資料片段以及引擎為MyISAM下的操作,

      對於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條資料,那這些片段就很影響效能了,至於它的解決辦法,我們上面也提到了,這裡就不再提了。我是辛星,期待您的關注。




相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.