同事認為定期delete資料可以清除memory table空間?
我們來看一下吧!
#建立memory table
我們來看一下吧!
#建立memory table
create table mem (id int) engine = memory;
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;
#你可以看到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遇到下面這個錯誤
若是資料不重要,truncate table tablename也行
再不然擴大max_heap_table_size,數字自己加大
set global max_heap_table_size = 16777216;
之後如果memory table遇到下面這個錯誤
就可以用alter table tablename set engine...來解囉ERROR 1114 (HY000): The table 'mem' is full
若是資料不重要,truncate table tablename也行
再不然擴大max_heap_table_size,數字自己加大
set global max_heap_table_size = 16777216;
0 意見:
張貼留言