MySQL:存储引擎相关命令、性能比较

news2024/9/17 8:52:01

目录

存储引擎

概念

类型

示例

数据库文件

MylSAM

.frm

.MYD

.MYI

InnoDB

.frm

.ibd

.opt

查看指定表的存储引擎类型

查看系统支持的存储引擎

修改存储引擎

通过配置文件指定存储引擎

使用alter修改

创建表的同时指定存储引擎

使用set命令临时指定存储引擎

比较MyISAM和InnoDB

写入速度比较

插入数据

tm表的存储过程

ti表的存储过程

测试

查询数据速度比较

没有索引的列

有索引的列

总结


存储引擎

概念

数据库存储引擎是数据库底层组件,数据库管理系统使用数据引擎进行创建、查询、更新和删除数据操作。

不同的存储引擎提供不同的存储机制、索引功能、锁定水平等功能,使用不同的存储引擎还可以获得特定的功能。

存储引擎是针对数据表的,在同一个数据库中,不同的表可以使用不同的存储引擎

类型

功能

MylSAM

MEMORY

InnoDB

存储限制

256TB

内存

64TB

支持事务

No

No

Yes

支持全文索引

Yes

No

No

支持树索引

Yes

Yes

Yes

支持哈希索引

No

Yes

No

支持数据缓存

No

N/A

Yes

支持外键

No

No

Yes

InnoDB:行级锁定(select * from tableName where name = 'tom' for update;)锁定该表的更新功能

MyISAM:表级锁定

示例

数据库文件

MylSAM

cd到mysql存放数据的data目录下的mysql目录

ls一下可以看到很多.frm、.MYD、MYI文件,这些文件都是MyISAM存储引擎生成的

[root@localhost data]# cd /usr/local/mysql/data/mysql
[root@localhost mysql]# ls
user.frm
user.MYD
user.MYI
  • .frm
    • 数据表结构,比如表有多少列,每个列的名字
  • .MYD
    • 存放表中数据
  • .MYI
    • 专门存放索引的信息的文件

InnoDB

先登录进数据库,然后创建一个数据库和表,再退出数据库

[root@localhost mysql]# mysql -uroot -p
mysql> create database auth;
mysql> use auth
mysql> create table users(id int(10), name char(20));
mysql> quit

退出后,在当前位置cd到上一级目录下,也就是/usr/local/mysql/data目录下

ls一下,可以看到一个和刚刚创建的数据库相同名称的目录,进入该目录

就可以看到,在auth的库中,一共有三个文件,这些文件都是由InnoDB生成的,这里每个表都对应了两个文件,分别是:.frm和.ibd文件

  • .frm
    • 存放数据表的元数据
  • .ibd
    • 和MyISAM的.MYD文件类似,存放数据表中的数据
  • .opt
    • 存放MySQL的配置信息
[root@localhost mysql]# cd ..
[root@localhost data]# ls
auth
[root@localhost data]# cd auth
[root@localhost auth]# ls
db.opt  users.frm  users.ibd

此时我们再次登录进数据库然后在auth库中创建第二个表

[root@localhost auth]# mysql -uroot -p
mysql> use auth
mysql> create table users001(id int(10), name char(20));
mysql> quit

再退出数据库,ls一下,可以看到又多了两个文件,而不是像第一次创建表时,多了三个文件

[root@localhost auth]# ls
db.opt  users001.frm  users001.ibd  users.frm  users.ibd

其实opt文件存储的是该数据库的配置信息,编码规则等信息,该库中的所有表共用该.opt文件

查看指定表的存储引擎类型

登录进MySQL,使用下方代码块内的show命令查看指定库指定表的状态信息

  • Engine: InnoDB:该表使用的存储引擎
  • Create_time:创建该表的时间
  • Collation: utf8_general_ci:校对字符集
[root@localhost auth]# mysql -uroot -p
mysql> show table status from auth where name = 'users'\G;
*************************** 1. row ***************************
           Name: users
         Engine: InnoDB
        # ...
    Create_time: 2024-07-29 09:21:14
    Update_time: NULL
     Check_time: NULL
      Collation: utf8_general_ci
      # 省略其他内容

查看系统支持的存储引擎

mysql> show engines;

修改存储引擎

通过配置文件指定存储引擎

[mysqld]单元内,修改存储引擎类型

[mysqld]
default-storage-engine=MYISAM
使用alter修改

进入要操作的数据库,通过alter命令修改表结构,来修改users表的存储引擎

修改完后,再使用show命令查询,可以看到存储引擎已经变成MyISAM

mysql> use auth
mysql> alter table users engine=myisam;
mysql> show table status from auth where name = 'users'\G;
*************************** 1. row ***************************
           Name: users
         Engine: MyISAM
        # 省略其他内容
mysql> quit

此时再退出数据库,ls查看当前目录下的文件,可以看到由于修改了存储引擎,又多出了两个文件

假如在一个表中设有事务相关的指令,如果此时把存储引擎从InnoDB改为MyISAM,由于MyISAM不支持事务,所以可能会导致该表出现错误无法使用

[root@localhost auth]# ls
db.opt  users001.frm  users001.ibd  users.frm  users.MYD  users.MYI
创建表的同时指定存储引擎

登录MySQL,进入auth数据库,创建表时在末尾使用engine选项指定存储引擎

创建完后,再使用show命令查看该表的状态信息,可以看到存储引擎是MyISAM

[root@localhost auth]# mysql -uroot -p
mysql> use auth
mysql> create table test (id int(10), name char(20)) engine=myisam;
mysql> show table status from auth where name = 'test'\G;
*************************** 1. row ***************************
           Name: test
         Engine: MyISAM
         # ...
使用set命令临时指定存储引擎

使用set命令临时指定默认存储引擎为MyISAM

新创建的表将默认使用 MyISAM 存储引擎,但在新的会话中或者重新启动 MySQL 后,这个设置会被重置

mysql> set default_storage_engine=myisam;
mysql> show table status from auth where name = 't2'\G;
*************************** 1. row ***************************
           Name: t2
         Engine: MyISAM

比较MyISAM和InnoDB

写入速度比较

比较处理数据的速度

创建用于比较两个存储引擎性能的数据库,然后进入该数据库

分别创建两个表,tm表示测试myisam的表,ti表示测试innodb的表

mysql> create database test;
mysql> use test
mysql> create table tm(id int(20) primary key auto_increment,name char(30)) engine=myisam;
mysql> create table ti(id int(20) primary key auto_increment,name char(30)) engine=innodb;
插入数据

这里我们使用存储过程插入一千万行数据,来比较两个存储引擎的存储效率

因为要在存储过程中写SQL语句,需要加分号(;)结尾,但是在编写的时候加分号结尾就直接退出了整个存储过程

所以需要先修改SQL语句的结束标识,才能正常编写存储过程的命令

mysql> delimiter $
tm表的存储过程

修改完结束标识符后,直接在mysql中输入以下语句

向表tm中插入从tom1到 tom10000000 这一千万条数据

create procedure insertm()
begin
set @i=1;
while @i<=10000000
do
insert into tm (name) values (concat("tom", @i));
set @i=@i+1;
end while;
end
$
ti表的存储过程

向表ti中插入从tom1到 tom10000000 这一千万条数据

create procedure inserti()
begin
set @i=1;
while @i<=10000000
do
insert into ti (name) values (concat("jerry", @i));
set @i=@i+1;
end while;
end
$

测试

先把结束标识符改回分号(;)以便进行下一步操作

使用 call 命令调用存储过程,然后等待执行完毕

mysql> delimiter ;
mysql> call insertm;
# 等待执行完毕...
Query OK, 0 rows affected (2 min 30.66 sec)    # 用时2分30.66秒
mysql> call inserti;
# 等待执行完毕...
Query OK, 0 rows affected (22 min 9.11 sec)    # 用时22分9.11秒

由此可见,MyISAM的写入速度比InnoDB更快

查询数据速度比较

没有索引的列
mysql> select * from tm where name > "tom100" and name < "tom10000000";
+---------+------------+
| id      | name       |
+---------+------------+
|    1000 | tom1000    |
|   10000 | tom10000   |
|  100000 | tom100000  |
| 1000000 | tom1000000 |
+---------+------------+
4 rows in set (1.02 sec)

mysql> select * from ti where name > "jerry100" and name < "jerry10000000";
+---------+--------------+
| id      | name         |
+---------+--------------+
|    1000 | jerry1000    |
|   10000 | jerry10000   |
|  100000 | jerry100000  |
| 1000000 | jerry1000000 |
+---------+--------------+
4 rows in set (2.12 sec)
有索引的列
mysql> select * from tm where id > 10 and id < 999999;
999988 rows in set (1.42 sec)
mysql> select * from ti where id > 10 and id < 999999;
999988 rows in set (0.40 sec)

总结

  • 写入速度:MyISAM更快
  • 读取速度(无索引):MyISAM更快
  • 读取速度(有索引):InnoDB更快

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1962842.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java入门-API学习

package API;//告诉编译器&#xff0c;编译之后应该放到哪个包里import API.try3.test3; import API.try3.test5; import itcast.test2;import java.util.Random; import java.util.Scanner;//导包 public class Introduce {public static void main(String[] args) {//别忘记写…

为何2024年这4款ai智能写作工具被赞为YYDS?

在数字化的大潮中&#xff0c;人工智能已经深入到我们生活的各个角落&#xff0c;当然也包括写作领域。随着ai智能写作工具的兴起&#xff0c;它们不仅显著提升了写作效率&#xff0c;还为创作打开了全新的可能性。今天&#xff0c;我们就来看看四款特别受欢迎的AI写作工具&…

QT log4qt 记录日志

一.环境 Qt 5.15.2 log4qt 二.源码 1.编译 log4qt 源码,生成dll文件,并将.h 拷贝至项目目录 2.main.cpp #include "mainwindow.h"#include <QApplication> #include <QDir> #include "Log4Qt/logmanager.h" #include "Log4Qt/pattern…

职场离职潮:年轻人的选择与挑战

近年来&#xff0c;随着社会的发展和个人价值观的变化&#xff0c;越来越多的人开始主动或被动地离开职场。这一现象在社交网络上引发了广泛的讨论&#xff0c;甚至出现了专门分享离职经历的“离职博主”。为了深入了解这一趋势背后的真实情况&#xff0c;近日相关机构展开了一…

【传输层协议】UDP和TCP协议

UDP协议 UDP协议全称为User Datagram Protocol&#xff0c;用户数据报协议。UDP协议报文格式如下&#xff1a; 16UDP长度。表示整个数据报的最大长度&#xff0c;即UDP首部UDP数据。这个字段帮助我们确保在网络字节流中获取完整的UDP报文信息。校验和&#xff1a;用于检测数…

法兰式满油阀SPF-125-12C、STF-125-12C

法兰式满油阀又名预充阀、充液阀&#xff0c;合金钢和球墨铸铁材质&#xff0c;体积小&#xff0c;易于拆卸&#xff0c;低压损&#xff0c;流量大&#xff0c;构造简单&#xff0c;耐久性佳&#xff0c;可直接装置于油缸盖侧&#xff0c;SPF-32-12C、STF-32-12C、SPF-50-12C、…

ZooKeeper中间件监控指标解读

监控易是一款功能全面的IT监控软件&#xff0c;能够实时监控各类IT资源和应用的状态&#xff0c;包括中间件、数据库、网络设备等。对于ZooKeeper这一重要的分布式协调服务中间件&#xff0c;监控易提供了详尽的监控指标&#xff0c;帮助用户全面了解ZooKeeper集群的运行状态。…

鸿蒙(API 12 Beta2版)NDK开发【使用Node-API接口进行异步任务开发】

使用Node-API接口进行异步任务开发 场景介绍 napi_create_async_work是Node-API接口之一&#xff0c;用于创建一个异步工作对象。可以在需要执行耗时操作的场景中使用&#xff0c;以避免阻塞主线程&#xff0c;确保应用程序的性能和响应性能。例如以下场景&#xff1a; 文件…

最新版Polyverse - Music Bundle Deal [06.2024],win和mac,支持intel和M1芯片

一。Polyverse插件套装 Polyverse - Music Bundle Deal 1.释放您的创作潜力 无论您是希望突破创作极限的音乐制作人&#xff0c;还是寻求新颖创新方式来增强混音的音频工程师&#xff0c;Polyverse 捆绑包交易都具有非凡的价值&#xff0c;可以帮助您将音乐提升到一个新的水平…

【数学建模】【优化算法】:【MATLAB】从【一维搜索】到】非线性方程】求解的综合解析

目录 第一章&#xff1a;一维搜索问题 黄金分割法 股票交易策略优化 总结&#xff1a; 第二章&#xff1a;线性规划 线性规划&#xff08;Simplex 算法&#xff09; 生产计划优化 总结&#xff1a; 第三章&#xff1a;无约束非线性优化问题 梯度下降法 神经网络训练…

Python中导入不同文件夹中的函数

1、代码举例&#xff1a;from Python_CodeFile.LDAP3.del_file.Get_Computer_Dn import get_computer_dn # 以上代码导入路径为&#xff1a;Python_CodeFile/LDAP3/del_file/Get_Computer_Dn.py 文件中的get_computer_dn函数。

传统放牧方式与北斗科技的碰撞:北三短报文头羊定位追踪器PD28守护放牧生活

在大草原的广袤天地中&#xff0c;放牧生活是蒙古族人民的传统之一。然而&#xff0c;除了美丽和自由&#xff0c;放牧生活也伴随着一些危险。以前由于科技落后&#xff0c;人工成本低&#xff0c;主要依靠人力去放牧&#xff0c;牧民放牧顶风踏雪走个几十公里都极为寻常。除了…

AI识别智能称重-收银系统源码

系统概况 专门为零售行业的连锁店量身打造的收银系统&#xff0c;适用于常规超市、生鲜超市、水果店、便利店、零食专卖店、服装店、母婴用品、农贸市场等类型的门店使用。同时线上线下数据打通&#xff0c;线下收银的数据与小程序私域商城中的数据完全同步&#xff0c;如商品…

【ROS 最简单教程 005/300】ROS + VSCode 开发环境快速搭建

VSCode 全称 Visual Studio Code&#xff0c;是微软出的一款轻量级代码编辑器&#xff0c;免费、开源而且功能强大 本篇将以最简单的方法引导基于 VSCode 的&#xff0c;超全面开发环境的搭建及相关配置完全不了解 ROS 编程的友友&#xff0c;建议先看 &#x1f449;快速体验 指…

WIFI7在游戏领域引发的变革

随着无线技术的快速进步&#xff0c;游戏体验正变得愈加丰富、复杂和逼真。现在最新的WIFI 7技术将带来新的飞跃&#xff0c;不仅有望重新定义网络游戏的体验&#xff0c;还有可能彻底革新整个游戏产业。可以想象一下&#xff0c;在未来&#xff0c;游戏世界不再有延迟和连接中…

【嵌入式】一种基于串口命令的模块测试API模板

本文主要记录一种用于嵌入式开发中【模块测试】通用模板&#xff0c;使用 getopt_long()函数作为串口命令行解析的工具&#xff0c;从而进行测试代码逻辑的编写。 本文以ADC 和 uart 测试为例&#xff0c;介绍函数的使用以及测试代码的编写 【测试环境说明 】 本文是在 rt-thr…

一篇长文搭建AI大模型应用平台架构

在研究了6家知名公司如何部署生成式AI应用程序后&#xff0c;注意到它们的平台有很多相似之处。概述了生成式AI大模型应用平台的常见组件、它们的作用以及它们的实现方式。尽力保持架构的通用性&#xff0c;但某些应用程序可能会有所不同。 Generative AI大模型应用平台整体架…

数据集相关类代码回顾理解 | StratifiedShuffleSplit\transforms.ToTensor\Counter

【PyTorch】图像多分类项目 目录 StratifiedShuffleSplit transforms.ToTensor Counter StratifiedShuffleSplit sss StratifiedShuffleSplit(n_splits1, test_size0.2, random_state0) 创建StratifiedShuffleSplit对象&#xff0c;用于将数据集划分为训练集和测试集。 …

农业物联网气象站的工作原理

TH-NQ10农业物联网气象站是一款集成了物联网与气象技术的创新设备&#xff0c;它在现代农业中扮演着重要角色&#xff0c;为农业生产提供了精准、实时的气象数据支持。以下是对农业物联网气象站的详细介绍&#xff1a; 定义与特点 农业物联网气象站通过物联网技术将气象观测设…

详解校门外的树(树状数组)

前言 在看之前建议先看一下 【学习笔记】详解树状数组-CSDN博客 题目 思路 建立两个树状数组,维护左括号与右括号。 假设有一个长度为10的数轴&#xff0c;我们要将区间[ 2 , 5 ]中种树&#xff0c;这时&#xff0c;我们将 2 处放一个左括号 ” ( ” ,5处放一个 ” )” &…