mysql optimize innodb 优化

如果对mysql表,进行大范围删除后,最好做一个表优化,这样会快一些。以前写过一篇类似的,针对myisam存储引擎的。请参考:实例说明optimize table在优化mysql时很重要



1、删除数据,并尝试优化


mysql> delete FROM `test` WHERE d_id>397136;  

Query OK, 306356 rows affected (19.48 sec)  

  

mysql> optimize table test;  

+------------+----------+----------+-------------------------------------------------------------------+  

| Table      | Op       | Msg_type | Msg_text                                                          |  

+------------+----------+----------+-------------------------------------------------------------------+  

| test1.test | optimize | note     | Table does not support optimize, doing recreate + analyze instead |  

| test1.test | optimize | status   | OK                                                                |  

+------------+----------+----------+-------------------------------------------------------------------+  

2 rows in set (0.35 sec)  

执行optimize的时候,非常慢,可能会卡死。msg_text信息的意思是innodb引擎,不支持optimize。在官网找了一下,发现以下内空


Table does not support optimize, doing recreate + analyze instead.
It is because the table that you are using is InnoDB.
You can optimize the InnoDB tables by using this.
ALTER TABLE table.name ENGINE='InnoDB';

一般情况下,由myisam转成innodb,会用alter table table.name engine='innodb'进行转换,优化也可以用这个


2、alter优化数据


mysql> alter table test engine='innodb';  
Query OK, 384781 rows affected (19.88 sec)  
Records: 384781  Duplicates: 0  Warnings: 0  

alter如果很慢,优化一下my.cnf,[mysqld]加上以下内容,并重新加载。


innodb_buffer_pool_size=1G  
innodb_file_io_threads=4  

innodb_file_io_threads常规配置,小于等CPU核数。innodb_buffer_pool_size小于等于物理内存的1/2,原则上够用就好。


3、优化后的对比


mysql> use information_schema  

mysql> select concat(round(sum(data_length/1024/1024),2),'MB') as data_length_MB,  

 -> concat(round(sum(index_length/1024/1024),2),'MB') as index_length_MB  

 -> from tables where  

 -> table_schema='test1'  

 -> and table_name = 'test';  

+----------------+-----------------+  

| data_length_MB | index_length_MB |  

+----------------+-----------------+  

| 20.55MB        | 27.55MB         |       //优化前  

+----------------+-----------------+  

1 row in set (0.01 sec)  

  

mysql> select concat(round(sum(data_length/1024/1024),2),'MB') as data_length_MB,  

 -> concat(round(sum(index_length/1024/1024),2),'MB') as index_length_MB  

 -> from tables where  

 -> table_schema='test1'  

 -> and table_name = 'test';  

+----------------+-----------------+  

| data_length_MB | index_length_MB |  

+----------------+-----------------+  

| 20.55MB        | 16.55MB         |    //优化后  

+----------------+-----------------+  

1 row in set (0.00 sec)  

data_length_MB,第一列是数据;index_length_MB,第二列是索引


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值