MySQL不同存储引擎下optimize的用法
optimize命令是mysql的常用优化命令,但是在InnoDB与MyISAM这两个存储引擎中却有很大的分别。本文将对这两个常用的存储引擎进行区分跟实例解析
1、查看mysql当前的存储引擎
一般情况下,mysql会默认提供多种存储引擎,你可以通过下面的查看: 看你的mysql现在已提供什么存储引擎:
mysql> show engines; 看你的mysql当前默认的存储引擎:
mysql> show variables like '%storage_engine%'; 你要看某个表用了什么引擎(在显示结果里参数engine后面的就表示该表当前用的存储引擎):
mysql> show create table 表名; 如下显示zabbix history表的存储引擎
MariaDB [zabbix]> show create table history \G;
*************************** 1. row ***************************
       Table: history
Create Table: CREATE TABLE `history` (
  `itemid` bigint(20) unsigned NOT NULL,
  `clock` int(11) NOT NULL DEFAULT '0',
  `value` double(16,4) NOT NULL DEFAULT '0.0000',
  `ns` int(11) NOT NULL DEFAULT '0',
  KEY `history_1` (`itemid`,`clock`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin
/*!50100 PARTITION BY RANGE (`clock`)
(PARTITION p201802010000 VALUES LESS THAN (1517500800) ENGINE = InnoDB,
 PARTITION p201802020000 VALUES LESS THAN (1517587200) ENGINE = InnoDB,
 PARTITION p201802030000 VALUES LESS THAN (1517673600) ENGINE = InnoDB,
 PARTITION p201802040000 VALUES LESS THAN (1517760000) ENGINE = InnoDB,
 PARTITION p201802050000 VALUES LESS THAN (1517846400) ENGINE = InnoDB,
 PARTITION p201802070000 VALUES LESS THAN (1518019200) ENGINE = InnoDB,
 PARTITION p201802080000 VALUES LESS THAN (1518105600) ENGINE = InnoDB,
 PARTITION p201802090000 VALUES LESS THAN (1518192000) ENGINE = InnoDB,
 PARTITION p201802100000 VALUES LESS THAN (1518278400) ENGINE = InnoDB,
 PARTITION p201802110000 VALUES LESS THAN (1518364800) ENGINE = InnoDB,
 PARTITION p201802120000 VALUES LESS THAN (1518451200) ENGINE = InnoDB,
 PARTITION p201802130000 VALUES LESS THAN (1518537600) ENGINE = InnoDB,
 PARTITION p201802140000 VALUES LESS THAN (1518624000) ENGINE = InnoDB,
 PARTITION p201802150000 VALUES LESS THAN (1518710400) ENGINE = InnoDB,
 PARTITION p201802160000 VALUES LESS THAN (1518796800) ENGINE = InnoDB,
 PARTITION p201802170000 VALUES LESS THAN (1518883200) ENGINE = InnoDB,
 PARTITION p201802180000 VALUES LESS THAN (1518969600) ENGINE = InnoDB,
 PARTITION p201802190000 VALUES LESS THAN (1519056000) ENGINE = InnoDB,
 PARTITION p201802200000 VALUES LESS THAN (1519142400) ENGINE = InnoDB,
 PARTITION p201802210000 VALUES LESS THAN (1519228800) ENGINE = InnoDB) */
1 row in set (0.00 sec)
当对表有大量的增删改操作时,需要用optimize对表进行优化。可以减少空间与提高I/O性能性能;
如果表存储引擎为MyISAM可以直接使用命令optimize table 表名;
查看show table status like 'history' \G; 中的data_free选项;data_free选项代表数据碎片。
如果是InnoDB引擎,首先查看innodb_file_per_table(是否独享表空间)。
MariaDB [zabbix]> show variables like 'innodb_file_per_table';
+-----------------------+-------+
| Variable_name | Value |
+-----------------------+-------+
| innodb_file_per_table | ON |
+-----------------------+-------+
row in set (0.01 sec)
ON代表共享表空间打开,OFF代表开启共享表空间没有打开,即采用的是默认的共享表空间。这个时候可以在mysql的datadir路径下看到一个非常大的文件ibdata1,这个文件存储了所有InnoDB表的数据与索引。
如果表是InnoDB,执行如下命令
MariaDB [zabbix]> optimize table history;
+----------------+----------+----------+-------------------------------------------------------------------+
| Table | Op | Msg_type | Msg_text |
+----------------+----------+----------+-------------------------------------------------------------------+
| zabbix.history | optimize | note | Table does not support optimize, doing recreate + analyze instead |
| zabbix.history | optimize | status | OK |
+----------------+----------+----------+-------------------------------------------------------------------+
rows in set (14.33 sec)
会返回如图信息,最后的一条Table does not support optimize, doing recreate + analyze instead,即代表optimize无法优化表。
这个时候使用如下命令优化表
MariaDB [zabbix]> alter table history ENGINE = 'InnoDB';
Query OK, rows affected (14.27 sec)
Records: Duplicates: Warnings: MariaDB [zabbix]> analyze table history;
+----------------+---------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+----------------+---------+----------+----------+
| zabbix.history | analyze | status | OK |
+----------------+---------+----------+----------+
row in set (0.00 sec)
如果开启了独享表空间,即每张表都有ibdfile。这个时候如果删除了大量的行,索引会重组并且会释放相应的空间因此不必优化
- 由于共享表空间所有表的数据与索引都存放于ibddata1文件中,随着数据量的增长会导致该文件越来越大。超过10G的时候查询速度就非常慢,因此在编译的时候最好开启独享表空间。因为mysql默认是关闭了独享表空间,下面有两个解决方案
 - 方案一:先逻辑备份所有的数据库,将配置文件中innodb_file_per_table参数=1,再将备份导入
 - 方案二:只要修改innodb_file_per_table参数,然后将需要修改的所有innodb的表都运行一遍 alter table table_name engine=innodb;即可使用第二种方式修改后,原来库中的表中的数据会继续存放于ibdata1中,新建的表才会使用独立表空间
 
MySQL不同存储引擎下optimize的用法的更多相关文章
- 设置mysql InnoDB存储引擎下取消自动提交事务
		
mysql 存储引擎中最长用的有两种,MyISAM 存储引擎和InnoDB存储引擎. 1.MyISAM 存储引擎 不支持事务,不支持外键,优势是访问速度快: 2.InnoDB存储引擎 支持事务,一般项 ...
 - MySQL InnoDB存储引擎体系架构 —— 索引高级
		
转载地址:https://mp.weixin.qq.com/s/HNnzAgUtBoDhhJpsA0fjKQ 世界上只两件东西能震撼人们的心灵:一件是我们心中崇高的道德标准:另一件是我们头顶上灿烂的星 ...
 - MySQL常用存储引擎功能与用法详解
		
本文实例讲述了MySQL常用存储引擎功能与用法. MySQL存储引擎主要有两大类: 1. 事务安全表:InnoDB.BDB. 2. 非事务安全表:MyISAM.MEMORY.MERGE.EXAMPLE ...
 - mysql 的存储引擎介绍
		
在数据库中存的就是一张张有着千丝万缕关系的表,所以表设计的好坏,将直接影响着整个数据库.而在设计表的时候,我们都会关注一个问题,使用什么存储引擎.等一下,存储引擎?什么是存储引擎? 什么是存储引擎? ...
 - mysql数据库存储引擎及区别
		
MySQL有多种存储引擎,每种存储引擎有各自的优缺点,可以择优选择使用:MyISAM.InnoDB.MERGE.MEMORY(HEAP).BDB(BerkeleyDB).EXAMPLE.FEDERAT ...
 - MySQL数据库----存储引擎
		
什么是存储引擎? 存储引擎说白了就是如何存储数据.如何为存储的数据建立索引和如何更新.查询数据等技术的实现方法.因为在关系数据库中数据的存储是以表的形式存储的,所以存储引擎也可以称为表类型(即存储和操 ...
 - MySql的存储引擎介绍
		
下面主要介绍InnoDB.MyISAM和MEMEORY三种存储引擎. InnoDB存储引擎 InnoDB遵循CNU通用公开许可(GPL)发行.InnoDB已经被一些重量级互联网公司所采用,如雅虎.Sl ...
 - MySQL之存储引擎(表类型)的选择
		
和大部分的数据库不同,MySQL中有一个存储引擎的概念,用户可以根据数据存储的需求来选择不同的存储引擎.本次博客就来介绍一下MySQL中的存储引擎.MySQL版本 5.7.19. 概述 MySQL的存 ...
 - MySQL-TokuDB:MySQL 高性能存储引擎:TokuDB
		
ylbtech-MySQL-TokuDB:MySQL 高性能存储引擎:TokuDB 1.返回顶部 1. 在安装MariaDB的时候了解到代替InnoDB的TokuDB,看简介非常的棒,这里对ToduD ...
 
随机推荐
- 关于web数据库的相关知识点的操作
			
主要是怎样建立与数据库的连接.对于框架是固定的: 下面是对于数据库的连接操作: package com.DBU; //数据库连接 import java.sql.Connection; import ...
 - eclipse 使用 快捷键
			
ctrl + t :查看类的子类和实现类 ctrl + o 查看类实现的方法 ctrl + 1 相当于idea的 alt + enter 补全变量 syso 点 alt + / System.out ...
 - 中阶 d03.5 (正篇)完整的Dao 操作数据库
			
1.目录结构: util---JDBCUtil.java(工具包,整合建立链接和释放资源的方法) dao---UserDao.java(接口,定义方法) impl---UserDaoImpl.java ...
 - 31.2 try finally使用
			
package day31_exception; import java.io.FileWriter; import java.io.IOException; import java.lang.Exc ...
 - .NET Core 3 WPF MVVM框架 Prism系列之导航系统
			
本文将介绍如何在.NET Core3环境下使用MVVM框架Prism基于区域Region的导航系统 在讲解Prism导航系统之前,我们先来看看一个例子,我在之前的demo项目创建一个登录界面: 我们看 ...
 - 六、路由详细介绍之动态路由RIP(了解一下就行)
			
动态路由分为距离矢量路由(RIP)和链路状态(OSPF和ISIS) 一.离矢量路由协议-RIP RIP协议现在基本上被淘汰. RIP动态路由协议工作原理,如上图: R12中有192.168.1.0和1 ...
 - group_concat有长度限制
			
group_concat有长度限制 group_concat 详细用法请点此链接. group_concat有长度限制!长度陷阱用了group_concat后,select里如果使用了li ...
 - Pormetheus(一)
			
(1)Prometheus由来普罗米修斯的灵感来自于谷歌的Borgmon.它最初是由马特·t·普劳德(Matt T. Proud)作为一个研究项目开发的,普劳德曾是谷歌(google)的一名雇员.在普 ...
 - 第一章:shell脚本初入门
			
1.shell脚本中的source或者.空格再加上文件,表示加载文件中的命令及语句(困惑多时终于解开^-^) 2.脚本开头书写好作者版本等信息,方便维护:流程语句提前把格式写好,防止遗漏 3.定义字符 ...
 - GeoGebra案例(傅里叶级数的方波)
			
傅里叶级数介绍:请移步参见这位马大佬的博文 https://www.matongxue.com/madocs/619.html 马大佬中的gif图在我看来是非常直观且有趣的,奈何本人本领实在有限,学习 ...