mysql的optimize

今天测试了一下optimize,发现不错,下面是测试过程:

CREATE TABLE `moe` (
  `phonenum` varchar(11) NOT NULL,
  `citynum` int(11) NOT NULL DEFAULT ‘0‘,
  `phonetype` int(11) DEFAULT NULL,
  PRIMARY KEY (`phonenum`,`citynum`)
)

load data infile ‘/tmp/hun.txt‘ into table moe FIELDS TERMINATED BY ‘,‘ ENCLOSED BY ‘"‘ LINES TERMINATED BY ‘\n‘;

mysql> select count(*) from moe;
+----------+
| count(*) |
+----------+
|  4232081 |
+----------+
1 row in set (1.75 sec)

[[email protected] moe]$ ll |grep moe
-rw-rw---- 1 mysql mysql      8644 9月  19 15:03 moe.frm
-rw-rw---- 1 mysql mysql 310378496 9月  19 15:15 moe.ibd

mysql> show index from moe;
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| moe   |          0 | PRIMARY  |            1 | phonenum    | A         |     4219450 |     NULL | NULL   |      | BTREE      |         |               |
| moe   |          0 | PRIMARY  |            2 | citynum     | A         |     4219450 |     NULL | NULL   |      | BTREE      |         |               |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
2 rows in set (0.00 sec)

mysql> delete from moe limit 2100000;        
Query OK, 2100000 rows affected, 1 warning (18.06 sec)

mysql> select count(*) from moe;
+----------+
| count(*) |
+----------+
|  2132081 |
+----------+
1 row in set (2.14 sec)

mysql> show index from moe;
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| moe   |          0 | PRIMARY  |            1 | phonenum    | A         |     2272822 |     NULL | NULL   |      | BTREE      |         |               |
| moe   |          0 | PRIMARY  |            2 | citynum     | A         |     2272822 |     NULL | NULL   |      | BTREE      |         |               |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
2 rows in set (0.00 sec)

index减少差不多一半

[[email protected] moe]$ ll |grep moe
-rw-rw---- 1 mysql mysql      8644 9月  19 15:03 moe.frm
-rw-rw---- 1 mysql mysql 310378496 9月  19 15:26 moe.ibd

表大小不变

optimize table moe;

mysql> show index from moe;
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| moe   |          0 | PRIMARY  |            1 | phonenum    | A         |     2126976 |     NULL | NULL   |      | BTREE      |         |               |
| moe   |          0 | PRIMARY  |            2 | citynum     | A         |     2126976 |     NULL | NULL   |      | BTREE      |         |               |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
2 rows in set (0.00 sec)

mysql> select count(*) from moe; 
+----------+
| count(*) |
+----------+
|  2132081 |
+----------+
1 row in set (0.84 sec)

[[email protected] moe]$ ll |grep moe
-rw-rw---- 1 mysql mysql     8644 9月  19 15:27 moe.frm
-rw-rw---- 1 mysql mysql 92274688 9月  19 15:28 moe.ibd

引用官方文档如下:

13.5.2.5. OPTIMIZE TABLE语法

OPTIMIZE [LOCAL |NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ...

如果您已经删除了表的一大部分,或者如果您已经对含有可变长度行的表(含有VARCHAR, BLOB或TEXT列的

表)进行了很多更改,则应使用OPTIMIZE TABLE。被删除的记录被保持在链接清单中,后续的INSERT操作会

重新使用旧的记录位置。您可以使用OPTIMIZE TABLE来重新利用未使用的空间,并整理数据文件的碎片。

在多数的设置中,您根本不需要运行OPTIMIZE TABLE。即使您对可变长度的行进行了大量的更新,您也不需

要经常运行,每周一次或每月一次即可,只对特定的表运行。

OPTIMIZETABLE只对MyISAM, BDB和InnoDB表起作用。

对于InnoDB表,OPTIMIZE TABLE被映射到ALTER TABLE上,这会重建表。

注意,在OPTIMIZE TABLE运行过程中,MySQL会锁定表。

OPTIMIZE TABLE语句被写入到二进制日志中,除非使用了自选的NO_WRITE_TO_BINLOG关键词(或其别

名LOCAL)。已经这么做了,因此,用于MySQL服务器的OPTIMIZE TABLE命令的作用相当于一个复制主服务

器,在默认情况下,这些命令将被复制到复制从属服务器中。

时间: 2024-12-26 13:18:33

mysql的optimize的相关文章

mysql的optimize table命令

在使用mysql的时候有时候,可能会发现尽管一张表删除了许多数据,但是这表表的数据文件和索引文件却奇怪的没有变小.这是因为mysql在删除数据(特别是有Text和BLOB)的时候,会留下许多的数据空洞,这些空洞会占据原来数据的空间,所以文件的大小没有改变.这些空洞在以后插入数据的时候可能会被再度利用起来,当然也有可能一直存在.这种空洞不仅额外增加了存储代价,同时也因为数据碎片化降低了表的扫描效率. mysql提供了解决这一个问题的方法:optimize table table_name 命令.该

mysql中OPTIMIZE TABLE的作用及使用

来看看手册中关于 OPTIMIZE 的描述: OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ... 如果您已经删除了表的一大部分,或者如果您已经对含有可变长度行的表(含有VARCHAR, BLOB或TEXT列的表)进行了很多更改,则应使用OPTIMIZE TABLE.被删除的记录被保持在链接清单中,后续的INSERT操作会重新使用旧的记录位置.您可以使用OPTIMIZE TABLE来重新利用未使用的空间,并整理

mysql中OPTIMIZE TABLE的作用

在使用mysql的时候有时候,可能会发现尽管一张表删除了许多数据,但是这张表表的数据文件和索引文件却奇怪的没有变小.这是因为mysql在删除数据(特别是有Text和BLOB)的时候,会留下许多的数据空洞,这些空洞会占据原来数据的空间,所以文件的大小没有改变.这些空洞在以后插入数据的时候可能会被再度利用起来,当然也有可能一直存在.这种空洞不仅额外增加了存储代价,同时也因为数据碎片化降低了表的扫描效率. 1.先来看看多次删除插入操作后的表索引情况 mysql> SHOW INDEX FROM `tb

MySQL中optimize优化表

前言 当对MySQL进行大量的增删改操作的时候,很容易产生一些碎片,这些碎片占据着空间,所以可能会出现删除很多数据后,数据文件大小变化不大的现象.当然新插入的数据仍然会利用这些碎片.但过多的碎片,对数据的插入操作是有一定影响的,此时,我们可以通过optimize来对表的优化. 为了更加直观的看到数据碎片,Mysql可以使用如下命令查看 show table status [like table_name] 如下图 data_free选项代表数据碎片. 针对MySQL的不同数据库存储引擎,在opt

使用参数innodb_file_per_table支持MySQL InnoDB表数据共享空间自动收缩

http://heylinux.com/archives/2367.html http://blog.csdn.net/ywh147/article/details/8996022 使用过MySQL的同学,刚开始接触最多的莫过于MyISAM表引擎了,这种引擎的数据库会分别创建三个文件:表结构.表索引.表数据空间.我们可以将某个数据库目录直接迁移到其他数据库也可以正常工作.然而当你使用InnoDB的时候,一切都变了.InnoDB 默认会将所有的数据库InnoDB引擎的表数据存储在一个共享空间中:i

mysql 排序

一.主要内容简介 MySQL排序是个老生长谈的话题,这次我们想由浅入深详细说说MySQL的几种排序模式,怎么选择不同排序模式,以及如何优化排序. 同时也希望通过本文能解决大家的几个疑问: MySQL什么时候做排序,怎么判断需要进行排序: MySQL有几种排序模式,有什么方法让MySQL选择不同的排序模式: MySQL排序跟 read_rnd_buffer_size 有啥关系,在哪些情况下增加 read_rnd_buffer_size 能优化排序效率: 怎么判断MySQL使用了磁盘排序,怎么避免或

清理 zabbix 历史数据, 缩减 mysql 空间

zabbix 由于历史数据过大, 因此导致磁盘空间暴涨,  下面是结局方法步骤 1. 停止 ZABBIX SERER 操作 [plain] view plaincopyprint? [[email protected] ~]# killall zabbix_server [[email protected] ~]# lsof -i:10051 2. 停止 mysql 操作 [plain] view plaincopyprint? [[email protected] dbdat]# mysqla

Mysql建立索引基础

转自:http://www.cnblogs.com/cy163/archive/2008/10/27/1320798.html 最普通的情况,是为出现在where子句的字段建一个索引.为方便讲述,我们先建立一个如下的表. Code代码如下: CREATE TABLE mytable ( id serial primary key, category_id int not null default 0, user_id int not null default 0, adddate int not

为MySQL数据库添加索引

为mysql数据库建立索引 转载:http://www.cnblogs.com/cy163/archive/2008/10/27/1320798.html 最普通的情况,是为出现在where子句的字段建一个索引.为方便讲述,我们先建立一个如下的表. Code代码如下: CREATE TABLE mytable ( id serial primary key, category_id int not null default 0, user_id int not null default 0, a