2014年8月17日 星期日

[MySQL]Memory Table的維護

       同事認為定期delete資料可以清除memory table空間?
       我們來看一下吧!

#建立memory table
create table mem (id int) engine = memory;
show table status like 'mem'\G




#插入測試資料
insert into mem SELECT @row := @row + 1 as row FROM information_schema.COLLATIONS t,information_schema.COLLATIONS t1, (SELECT @row := 0) r;
show table status like 'mem'\G


#刪除大部分資料
#你可以看到data_length並沒有減少,data_free(已分配未使用的長度)反而增加了
delete from mem where id < 38809;
show table status like 'mem'\G


#再插入測試資料(你可以看到data_length並沒有改變,data_free(已分配未使用的長度)0了,表示資料塞回那些未使用的地方),中間沒有破碎  
insert into mem SELECT @row := @row + 1 as row FROM information_schema.COLLATIONS t,information_schema.COLLATIONS t1, (SELECT @row := 0) r;
show table status like 'mem'\G



#刪除大部分資料
#你可以看到data_length並沒有減少,data_free(已分配未使用的長度)反而增加了
#看到這裡大概可以推測delete並沒有釋放空間,data_length不會因delete而減少
delete from mem where id < 38000;


#那要怎麼回收那些未使用的空間呢?怎麼減少破碎?我們可以利用alter table來回收空間喔
#可以看到data_length終於減少,data_free歸零囉
#重要的是資料還是存在喔
select * from mem limit 10;
alter table mem engine = memory;
show table status like 'mem'\G


mysql> select * from mem limit 10;
+-------+
| id    |
+-------+
| 38808 |
| 38807 |
| 38806 |
| 38805 |
| 38804 |
| 38803 |
| 38802 |
| 38801 |
| 38800 |
| 38799 |
+-------+

10 rows in set (0.00 sec)

        之後如果memory table遇到下面這個錯誤
ERROR 1114 (HY000): The table 'mem' is full
        就可以用alter table tablename set engine...來解囉

        若是資料不重要,truncate table tablename也行

        再不然擴大max_heap_table_size,數字自己加大

        set global max_heap_table_size = 16777216;

0 意見:

張貼留言