链接MySQL是一种流行的关系型数据库管理系统(RDBMS),广泛用于开发 Web 应用程序和其他类型的软件。它提供了一个可靠、灵活和高性能的数据存储解决方案。
安装MySQL可以通过以下步骤完成:
- 访问MySQL官方网站:前往MySQL官方网站(https://www.mysql.com/)。
- 选择适合您操作系统的版本:在下载页上,选择适合您操作系统的MySQL版本。MySQL提供了各种不同的版本,包括社区版(Community Edition)和企业版(Enterprise Edition),您可以根据自己的需要选择适合的版本。
- 下载安装程序:在选择版本后,点击下载按钮来获取安装程序。根据您的操作系统选择相应的安装文件(如Windows平台下的EXE文件、macOS平台下的DMG文件等)。
- 运行安装程序:下载完成后,运行安装程序并按照提示进行安装。根据操作系统的不同,安装过程可能会有所不同。通常情况下,您需要接受许可协议、选择安装路径和配置选项,以及设置root用户的密码等。
- 完成安装:完成上述步骤后,安装程序会开始复制文件、配置数据库服务器和创建启动脚本等操作。一旦安装成功,您将看到安装完成的提示。
- 验证安装:在安装完成后,您可以通过命令行或者图形界面工具连接到MySQL服务器,并执行一些基本操作来验证安装是否成功。
注意:在安装MySQL之前,请确保您的计算机满足安装要求,并备份重要数据以防止意外数据丢失。
这些是一般情况下安装MySQL的步骤。具体操作可能因操作系统和MySQL版本而有所不同。如果您遇到任何问题,可以参考官方文档或在安装过程中查找特定的安装指南。
MySQL环境搭建
MySQL的下载
MySQL的4大版本
MySQL Community Server 社区版本,开源免费,自由下载,但不提供官方技术支持,适用于 大多数普通用户。
MySQL Enterprise Edition 企业版本,需付费,不能在线下载,可以试用30天。提供了更多的 功能和更完备的技术支持,更适合于对数据库的功能和可靠性要求较高的企业客户。
MySQL Cluster 集群版,开源免费。用于架设集群服务器,可将几个MySQL Server封装成一个 Server。需要在社区版或企业版的基础上使用。
MySQL Cluster CGE 高级集群版,需付费。
本篇文章选择社区版下载进行安装,
步骤1:打开MySQL官方地址:MySQL。
在这里插入图片描述
步骤2:进入官网后,点击 DOWNLOADS,进入下载页面。然后,点击 MySQL Community(GPL) Downloads
步骤3:点击 MySQL Community Server
步骤4:在 General Availability(GA) Releases 中选择适合的版本
Windows平台下提供两种安装文件:MySQL二进制分发版(.msi安装文件)和免安装版(.zip压缩文件)。
一般来讲,应当使用二进制分发版,因为该版本提供了图形化的安装向导过程,比其他的分发版使用起来要简单,不再需要其他工具启动就可以运行MySQL。
在 Windows 系统下推荐下载 MSI 安装程序,点击 Go to Download Page 进行下载。
Windows 下的 MySQL8.0 安装有两种安装程序:
mysql-installer-web-community-8.0.29.0.msi 下载程序大小:2.3M;安装时需要联网安装组件。
mysql-installer-community-8.0.29.0.msi 下载程序大小:439.6M;安装时离线安装即可(推荐)。
本篇文章选择安装的是8.0.26版本,而现在最新版本为8.0.29,若要下载8.0.26版本,选择Archives,选择8.0.26版本下载。
若要安装MySQL5.7版本的话,选择Archives,接着选择MySQL5.7的相应版本即可。本文下载MySQL5.7.34的版本。
步骤5:下载MySQL安装包。注意:下载安装包需要登录Oracle账户,本篇文章默认Oracle账户已登录的状态。MySQL安装包如下图所示。
MySQL8.0的安装
MySQL下载完成后,找到下载文件,双击进行安装,具体操作步骤如下。
步骤1:双击下载的 mysql-installer-community-8.0.26.0.msi 文件,打开安装向导。
步骤2:打开“Choosing a Setup Type”(选择安装类型)窗口,总有5种安装类型:
Developer Default(默认安装类型)
Server only(仅作为服务器)
Client only(仅作为客户端)
Full(完全安装)
Custom(自定义安装)。
这里选择“Custom”类型按钮,单击“Next(下 一步)”按钮。
步骤3:打开“Select Products” (选择产品)窗口,可以定制需要安装的产品清单。本文中,选择“MySQL Server 8.0.26-X64”后,单击“→”添加按钮,即可选择安装MySQL服务器,如图所示。采用通用的方法,可以添加其他需要安装的产品。
此时如果直接“Next”(下一步),则产品的安装路径是默认的。如果想要自定义安装目录,则可以选中对应的产品,然后在下面会出现“Advanced Options”(高级选项)的超链接。
单击“Advanced Options”(高级选项)则会弹出安装目录的选择窗口,如图所示,此时可以分别设置 MySQL的服务程序安装目录和数据存储目录。如果不设置,默认分别在C盘的Program Files目录和 ProgramData目录(注意:这是隐藏目录)。如果自定义安装目录,自定义的目录必须没有中文。另外,建议安装目录和数据目录分开存放。
步骤4:在上一步选择好自定义目录之后,点击“OK”,再单击“Next”(下一步)进入确认窗口,如图所示。单击 “Execute”(执行)按钮开始安装。
步骤5:安装完成后在“Status”(状态)列表下将显示“Complete”(安装完成),如图所示。
MySQL的配置
MySQL安装之后,需要对服务器进行配置。具体的配置步骤如下。
步骤1:在安装完成后,单击“Next”(下一步)按钮,就可以进入产品配置窗口,如图所示。
步骤2:单击“Next”(下一步)按钮,进入MySQL服务器类型配置窗口,如图所示。端口号一般选择默认端口号3306。
其中,“Config Type”选项用于设置服务器的类型。而服务器的类型共有三种,如图所示。
Development Computer(开发机器):该选项代表典型个人用桌面工作站。此时机器上需要运行多个应用程序,那么MySQL服务器将占用最少的系统资源。
Server Computer(服务器):该选项代表服务器,MySQL服务器可以同其他服务器应用程序一起运行,例如Web服务器等。MySQL服务器配置成适当比例的系统资源。
Dedicated Computer(专用服务器):该选项代表只运行MySQL服务的服务器。MySQL服务器配置成使用所有可用系统资源。
步骤3:单击“Next”(下一步)按钮,打开设置授权方式窗口。在MySQL8.0版本之后,有两种授权方式:
Use Strong Password Encryption for Authentication(RECOMMENDED):这是 MySQL8.0 版本提供的新的授权方式,采用SHA256基础的密码加密方法,使得数据库会更加安全。
Use Legacy Authentication Method(Retain MySQL 5.x Compatibality):传统的授权方式,它保留 5.x 版本的兼容性。
步骤4:单击“Next”(下一步)按钮,打开设置服务器root超级管理员的密码窗口,需要输入两次同样的登录密码。除了设置root超级管理员之外,还可以通过“Add User”添加其他用户,添加其他用户时,需要指定用户名、允许该用户名在哪台/哪些主机上登录,还可以指定用户角色等。本文暂不添加用户。
步骤5:单击“Next”(下一步)按钮,打开设置服务器名称窗口,如图所示。该服务名会出现在Windows 服务列表中,也可以在命令行窗口中使用该服务名进行启动和停止服务。本文将服务名设置为 “MySQL8.0”。如果希望开机自启动服务,也可以勾选“Start the MySQL Server at System Startup”选项(推荐)。
服务器的方式运行服务有两种:
Standard System Account:标准系统用户(推荐使用)
Custom User:自定义用户
步骤6:单击“Next”(下一步)按钮,打开确认设置服务器窗口,单击“Execute”(执行)按钮,执行配置。
步骤7:全部都打对勾,表示配置完成。单击“Finish”(完成)按钮,即可完成服务器的配置。
步骤8:如果还有其他产品需要配置,可以选择其他产品,然后继续配置。本文没有其他产品的配置,直接单击“Next” (下一步),完成整个安装和配置过程。
步骤9:至此,MySQL8.0 版本的安装和配置就已全部完成。
环境变量的配置
如果不配置MySQL环境变量,就不能在命令行直接输入MySQL登录命令。配置MySQL的环境变量步骤如下:
步骤1:在桌面上右击【此电脑】图标,在弹出的快捷菜单中选择【属性】菜单命令。
步骤2:打开【系统】窗口,单击【高级系统设置】链接。
步骤3:打开【系统属性】对话框,选择【高级】选项卡,然 后单击【环境变量】按钮。
步骤4:打开【环境变量】对话框,在系统变量列表中选择path变量。
步骤 5:单击【编辑】按钮,在【编辑环境变量】对话框中,将MySQL应用程序的bin目录(D:\software\MySQL\MySQL Server 8.0\bin)添加到变量值中,用分号将其与其他路径分隔开。
步骤6:添加完成之后,单击【确定】按钮,这样就完成了配置path变量的操作,然后就可以直接输入MySQL命令来登录数据库了。
测试
使用”win+r“快捷键调出黑框,输入 mysql --version 命令查询MySQL的版本号。如图所示,表示安装MySQL成功。
使用命令 mysql -uroot -p123456 登录MySQL8.0。注意在输入MySQL的登录密码时,-p 后面直接加登录密码会提示这是不安全的,如下图中的第一种情况;-p 之后不加登录密码,后面再输入密码时,密码是隐藏的,所以这种方式比较安全,也是推荐的密码输入方法。
MySQL5.7的安装与配置
步骤1:双击下载的 mysql-installer-community-5.7.34.0.msi 文件,打开安装向导。因为已经安装过MySQL8.0,所以再次安装时,会弹出欢迎界面。
步骤2:单击“Next”(下一步)按钮,打开版本升级界面,这里不更新服务器,将对勾取消,点击”Cancel“。
弹出确认框,点击”Yes“即可。
步骤3:弹出安装界面,点击”Add“,添加MySQL5.7版本。
之后的MySQL5.7的安装与配置和MySQL8.0的安装与配置相似,这里不再赘述,只需要主要一下几个地方的配置就行。
第1点:在高级设置中的自定义目录时,会弹出警告,忽略即可。
第2点:在配置MySQL5.7时,端口号不能与MySQL8.0的一致。这里将MySQL5.7的端口号设置为13306。
MySQL解决了那些问题
MySQL是一种流行的关系型数据库管理系统(RDBMS),它解决了以下几个问题:
- 数据存储和管理:MySQL提供了可靠的数据存储和管理机制,可以有效地存储、组织和检索大量结构化数据。它支持多种数据类型,包括数字、字符串、日期时间等,以及各种数据操作和查询。
- 数据安全性:MySQL提供了各种安全措施来保护数据的完整性和安全性。它支持用户认证和权限管理,可以限制对数据库和表的访问权限,确保只有授权的用户可以对数据进行操作。
- 并发处理:MySQL具备高度的并发处理能力,可以同时处理多个用户的请求。它使用了事务管理和锁机制,确保数据的一致性和并发访问的正确性。
- 数据备份和恢复:MySQL提供了备份和恢复机制,可以定期备份数据库以避免数据丢失,并在需要时快速恢复数据。
- 数据索引和查询优化:MySQL支持索引技术,可以加速数据的检索和查询操作。它还提供了查询优化器,自动选择最佳执行计划来提高查询性能。
- 扩展性和可伸缩性:MySQL支持水平和垂直扩展,可以通过添加更多的硬件资源或分布式部署来实现更大规模的数据存储和处理。
- 跨平台性:MySQL可以在多个操作系统上运行,包括Windows、Linux、macOS等,具有良好的跨平台性和可移植性。
- 开源和社区支持:MySQL是开源软件,拥有庞大活跃的开发者社区,提供了丰富的文档、示例和第三方工具,便于开发人员使用和扩展。
综上所述,MySQL解决了数据存储和管理、数据安全性、并发处理、数据备份和恢复、数据索引和查询优化、扩展性和可伸缩性、跨平台性以及开源和社区支持等多个问题,使得开发人员能够高效地处理和管理大量的结构化数据。
MySQL的一些要点:
- 数据库和表:MySQL 数据库由一个或多个表组成。每个表由一组列(字段)和行(记录)组成。
- 数据类型:MySQL 支持各种数据类型,包括整数、浮点数、字符串、日期等。
- 数据操作:可以使用 SQL(Structured Query Language)语句对数据库进行操作。常见的操作包括插入数据、查询数据、更新数据和删除数据。
- 索引和主键:可以在表上创建索引,提高查询性能。主键是唯一标识表中每行数据的列。
- 查询语句:SELECT 语句用于从表中检索数据。可以使用各种条件来过滤数据,并使用排序、聚合和分组来处理数据。
- 数据连接:通过 JOIN 操作可以将多个表连接在一起,从而获得更复杂的查询结果。
- 数据库管理:MySQL 提供了一些管理工具,如创建数据库和表、设定用户权限等。
- 事务处理:MySQL 支持事务处理,可以确保数据库操作的一致性和完整性。
- 备份和恢复:可以使用 MySQL 的备份工具来创建数据库备份,并在需要时进行恢复。
- 扩展性:MySQL 可以与各种编程语言和开发框架集成,如 PHP、Java、Python等,使开发者拥有更大的灵活性和可扩展性。
MySQL数据库的基本概念:
- 数据库(Database):是一个包含数据表、视图、函数等对象的容器。一个MySQL服务器可以包含多个数据库。
- 数据表(Table):是MySQL中存储数据的基本结构。它由行和列组成,行代表记录,列代表字段。
- 列(Column):也被称为字段(Field),代表数据表中的一个属性。每个列都有一个数据类型和约束。
- 行(Row):也被称为记录(Record),代表数据表中的一条数据。
- 主键(Primary Key):一列或一组列,用于唯一标识数据表中的每条记录。
- 外键(Foreign Key):用于建立数据表之间的关联关系。它指向另一个表的主键。
- 索引(Index):用于加快查询操作的数据结构。可以在一个或多个列上创建索引。
- 视图(View):是基于一个或多个表的查询的结果集。它可以像表一样被查询、更新和删除。
- 存储过程(Stored Procedure):是一组预编译的SQL语句,类似于子程序或函数,可以在数据库中被调用和执行。
- 触发器(Trigger):是一段SQL代码,可以在数据库中的特定操作(如插入、更新、删除)发生时自动执行。
MySQL数据库使用
1.MySQL的使用
MySQL安装后,MySQL会以windows服务的方式为我们提供数据存储功能。开启和关闭服务的操作:右键点击我的电脑→管理→服务→可以找到MySQL服务开启或停止。
MySQL安装后,MySQL会以windows服务的方式为我们提供数据存储功能。开启和关闭服务的操作:右键点击我的电脑→管理→服务→可以找到MySQL服务开启或停止。
也可以在DOS窗口,通过命令完成MySQL服务的启动和停止(必须以管理运行cmd命令窗口)
总结:
方式1: 我的电脑-----> (右键)管理---->服务和应用程序---->服务----找到MySQL服务右键启动或关闭
方式2: 进入dos窗口 使用命令: net start mysql 开启MySQL服务; 命令:net stop mysql 关闭MySql服务
2.MySQL的登录
MySQL是一个需要账户名密码登录的数据库,登陆后使用,它提供了一个默认的root账号,使用安装时设置的密码即可登录。
格式1:cmd> mysql –u用户名 –p密码
例如:mysql -uroot –proot
格式2:cmd> mysql --host=ip地址 --user=用户名 --password=密码
例如:mysql --host=127.0.0.1 --user=root --password=root
简单SQL语句
1.什么是SQL语句
- 结构化查询语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。关系数据库语言的国际标准;
- 各个数据库厂商都支持ISO的SQL标准;
- 各个数据库厂商在标准基础上做了自己的扩展。
2.SQL分类
- 数据定义语言:简称DDL(Data Definition Language),用来定义数据库对象:数据库,表,列等。关键字:create,alter,drop等
- 数据操作语言:简称DML(Data Manipulation Language),用来对数据库中表的记录进行更新。关键字:insert,delete,update等
- 数据控制语言:简称DCL(Data Control Language),用来定义数据库的访问权限和安全级别,及创建用户。
- 数据查询语言:简称DQL(Data Query Language),用来查询数据库中表的记录。关键字:select,from,where等
3.SQL通用语法
- SQL语句可以单行或多行书写,以分号结尾;
- 可使用空格和缩进来增强语句的可读性;
- MySQL数据库的SQL语句不区分大小写,建议使用大写,例如:SELECT * FROM user;
- 同样可以使用/**/的方式完成注释。
4.数据表中的数据类型
**整数类型** :
tinyInt 很小的整数
smallint 小的整数
mediumint 中等大小的整数
int(integer) 普通大小的整数
**小数类型** :
float 单精度浮点数
double 双精度浮点数
decimal(m,d) 压缩严格的定点数
**日期类型** :
year YYYY 1901~2155
time HH:MM:SS -838:59:59~838:59:59
date YYYY-MM-DD 1000-01-01~9999-12-3
datetime YYYY-MM-DD HH:MM:SS 1000-01-01 00:00:00~ 9999-12-31 23:59:59
timestamp YYYY-MM-DD HH:MM:SS 1970~01~01 00:00:01 UTC~2038-01-19 03:14:07UTC
**文本、二进制类型** :
CHAR(M) M为0~255之间的整数
VARCHAR(M) M为0~65535之间的整数
TINYBLOB 允许长度0~255字节
BLOB 允许长度0~65535字节
MEDIUMBLOB 允许长度0~167772150字节
LONGBLOB 允许长度0~4294967295字节
TINYTEXT 允许长度0~255字节
TEXT 允许长度0~65535字节
MEDIUMTEXT 允许长度0~167772150字节
LONGTEXT 允许长度0~4294967295字节
VARBINARY(M)允许长度0~M个字节的变长字节字符串
BINARY(M) 允许长度0~M个字节的定长字节字符串
MySQL中的我们常使用的数据类型如下
5.数据库操作
创建数据库
格式:
create database 数据库名;
create database 数据库名 character set 字符集;
例如:
#创建数据库 数据库中数据的编码采用的是安装数据库时指定的默认编码 utf8
CREATE DATABASE mybase;
#创建数据库 并指定数据库中数据的编码
CREATE DATABASE mybase CHARACTER SET utf8;
查看数据库
查看数据库MySQL服务器中的所有的数据库:show databases;
查看某个数据库的定义的信息:show create database 数据库名;
删除数据库
drop database 数据库名称;
例如:drop database mybase;
使用数据库
use 数据库名;
查看正在使用的数据库
select database();
6.表相关操作
1.创建表
格式:
create table 表名(
字段名 类型(长度) 约束,
字段名 类型(长度) 约束
);
例如:
###创建分类表
CREATE TABLE sort (
sid INT, #分类ID
sname VARCHAR(100) #分类名称
);
单表约束:
主键约束:primary key,要求被修饰的字段:唯一和非空
唯一约束:unique,要求被修饰的字段:唯一
非空约束:not null,要求被修饰的自动:非空
2.主键约束
在创建表时创建主键,在字段后面加上 primary key
例如:
create table tablename(
id int primary key,
…
)
在创建表时创建主键,在表创建的最后来指定主键
例如:
create table tablename(
id int,
…,
primary key(id)
)
删除主键:alter table 表名 drop primary key
例如:
alter table sort drop primary key;
主键自动增长:一般主键是自增长的字段,不需要指定。
实现添加自增长语句,主键字段后加auto_increment(只适用MySQL)
例如:
###创建分类表
CREATE TABLE sort (
sid INT PRIMARY KEY auto_increment, #分类ID
sname VARCHAR(100) #分类名称
);
3.查看表
查看数据库中的所有表:格式:show tables;
查看表结构:
格式:desc 表名;
例如:desc sort;
4.删除表
格式:drop table 表名
5.修改表
添加一列:alter table 表名 add 字段名 类型(长度) [约束]
修改列的类型(长度、约束):alter table 表名 modify 要修改的字段名 类型(长度) [约束]
修改列的列名:alter table 表名 change 旧列名 新列名 类型(长度) [约束]
删除表的列:alter table 表名 drop 列名
修改表名:rename table 表名 to 新表名
修改表的字符集:alter table 表名 character set 编码
6.插入表记录
语法:
insert into 表 (列名1,列名2,列名3…) values (值1,值2,值3…); – 向表中插入某些列
insert into 表 values (值1,值2,值3…); --向表中插入所有列
注意:
插入的数据应与字段的数据类型相同
数据的大小应该在列的长度范围内
在values中列出的数据位置必须与被加入列的排列位置相对应。
除了数值类型外,其它的字段类型的值必须使用引号引起。
如果要插入空值,可以不写字段,或者插入 null。
对于自动增长的列在操作时,直接插入null值即可。
插入数据中文乱码问题解决办法:set names 编码;
7.更新表记录
语法:
update 表名 set 字段名=值,字段名=值;
update 表名 set 字段名=值,字段名=值 where 条件;
注意:
列名的类型与修改的值要一致.
修改值得时候不能超过最大长度.
值如果是字符串或者日期需要加’’.
8.删除表记录
语法:
delete from 表名 [where 条件];
或者
truncate table 表名;
面试题:
删除表中所有记录使用delete from 表名; 还是用truncate table 表名;
删除方式:delete 一条一条删除,不清空auto_increment记录数。
truncate 直接将表删除,重新建表,auto_increment将置为零,从新开始
9.查询操作
语法:
select [distinct] | 列名,列名 from 表名 [where条件]
查询所有
select * from 表名;
查询指定字段信息
select 字段1,字段2,…from 表名;
别名查询,使用的as关键字,as可以省略的.
别名可以给表中的字段,表设置别名。 当查询语句复杂时,使用别名可以极大的简便操作。
表别名格式:
select * from 表名 as 别名;
或
select * from 表名 别名;
列别名格式:
select 字段名 as 别名 from 表名;
或
select 字段名 别名 from 表名;
去掉重复值查询
distinct用于去除重复记录
select distinct 字段 from 表名;
我们在sql语句的操作中,可以直接对列进行运算。
例如:将所有账务的金额+10000元进行显示.
select pname,price+10000 from product;
条件查询
结合where进行条件查询
排序
升序查询:select … order by 字段1 asc,字段2 asc…
降序查询:select … order by 字段1 desc,字段2 desc …
例如:
商品表中价格按升序排列:select * from product order by price asc;
聚合查询
常用的聚合函数:
sum()求和
avg()平均
max()最大值
min()最小值
count()计数
注意:聚合函数不统计null值
例如:
获得所有商品价格总和:select sum(price) from product;
获得所有商品的平均价格:select avg(price) from product;
获得所有商品的个数:select count() from product;
10.分组操作
group by 字段;
MySQL存储引擎
以下是几个MySQL常见的存储引擎:
- InnoDB:InnoDB是MySQL的默认存储引擎,它支持事务处理和行级锁定。它具有良好的数据完整性、并发性能和崩溃恢复能力,适用于大部分应用场景。
- MyISAM:MyISAM是另一个常见的MySQL存储引擎,它不支持事务处理和行级锁定,但具有较高的性能和较低的存储空间消耗。它适合于读密集型的应用,如数据仓库、日志分析等。
- MEMORY:MEMORY存储引擎将表的数据存储在内存中,因此读取速度非常快。但是,一旦数据库服务器关闭,所有数据将丢失。MEMORY引擎适用于缓存表、临时表等临时性数据存储需求。
- NDB Cluster:NDB Cluster存储引擎是MySQL提供的一个分布式数据库存储引擎。它可用于构建高可用、高性能的集群系统,支持数据的分片和自动故障转移。
除了以上几个存储引擎外,MySQL还支持其他一些存储引擎,如CSV、Archive、Blackhole等。选择适合的存储引擎要根据应用需求、数据特性和性能要求来进行评估和选择。
1. 查看存储引擎
查看mysql提供什么存储引擎:
show engines;
show engines \G;
mysql> show engines \G;
*************************** 1. row ***************************
Engine: FEDERATED
Support: NO
Comment: Federated MySQL storage engine
Transactions: NULL
XA: NULL
Savepoints: NULL
*************************** 2. row ***************************
Engine: MEMORY
Support: YES
Comment: Hash based, stored in memory, useful for temporary tables
Transactions: NO
XA: NO
Savepoints: NO
*************************** 3. row ***************************
Engine: InnoDB
Support: DEFAULT
Comment: Supports transactions, row-level locking, and foreign keys
Transactions: YES
XA: YES
Savepoints: YES
*************************** 4. row ***************************
Engine: PERFORMANCE_SCHEMA
Support: YES
Comment: Performance Schema
Transactions: NO
XA: NO
Savepoints: NO
*************************** 5. row ***************************
Engine: MyISAM
Support: YES
Comment: MyISAM storage engine
Transactions: NO
XA: NO
Savepoints: NO
*************************** 6. row ***************************
Engine: MRG_MYISAM
Support: YES
Comment: Collection of identical MyISAM tables
Transactions: NO
XA: NO
Savepoints: NO
*************************** 7. row ***************************
Engine: BLACKHOLE
Support: YES
Comment: /dev/null storage engine (anything you write to it disappears)
Transactions: NO
XA: NO
Savepoints: NO
*************************** 8. row ***************************
Engine: CSV
Support: YES
Comment: CSV storage engine
Transactions: NO
XA: NO
Savepoints: NO
*************************** 9. row ***************************
Engine: ARCHIVE
Support: YES
Comment: Archive storage engine
Transactions: NO
XA: NO
Savepoints: NO
9 rows in set (0.00 sec)
ERROR:
No query specified
2. 设置系统默认的存储引擎
查看默认的存储引擎
show variables like '%storage_engine%';
#或
SELECT @@default_storage_engine;
修改默认的存储引擎
如果在创建表的语句中没有显式指定表的存储引擎的话,那就会默认使用 InnoDB 作为表的存储引擎。如果我们想改变表的默认存储引擎的话,可以这样写启动服务器的命令行:
SET DEFAULT_STORAGE_ENGINE=MyISAM;
或者修改 my.cnf 文件:
default-storage-engine=MyISAM
# 重启服务
systemctl restart mysqld.service
3. 设置表的存储引擎
存储引擎是负责对表中的数据进行提取和写入工作的,我们可以为 不同的表设置不同的存储引擎 ,也就是说不同的表可以有不同的物理存储结构,不同的提取和写入方式。
3.1 创建表时指定存储引擎
我们之前创建表的语句都没有指定表的存储引擎,那就会使用默认的存储引擎 InnoDB 。如果我们想显式的指定一下表的存储引擎,那可以这么写:
CREATE TABLE 表名(
建表语句;
) ENGINE = 存储引擎名称;
3.2 修改表的存储引擎
如果表已经建好了,我们也可以使用下边这个语句来修改表的存储引擎:
ALTER TABLE 表名 ENGINE = 存储引擎名称;
比如我们修改一下 engine_demo_table 表的存储引擎:
这时我们再查看一下 engine_demo_table 的表结构:
4. 引擎介绍
4.1 InnoDB 引擎:具备外键支持功能的事务存储引擎
- MySQL从3.23.34a开始就包含InnoDB存储引擎。 大于等于5.5之后,默认采用InnoDB引擎 。
- InnoDB是MySQL的 默认事务型引擎 ,它被设计用来处理大量的短期(short-lived)事务。可以确保事务的完整提交(Commit)和回滚(Rollback)。
- 除了增加和查询外,还需要更新、删除操作,那么,应优先选择InnoDB存储引擎。
- 除非有非常特别的原因需要使用其他的存储引擎,否则应该优先考虑InnoDB引擎。
- 数据文件结构:
- 表名.frm 存储表结构(MySQL8.0时,合并在表名.ibd中)
- 表名.ibd 存储数据和索引
- InnoDB是 为处理巨大数据量的最大性能设计 。
- 在以前的版本中,字典数据以元数据文件、非事务表等来存储。现在这些元数据文件被删除了。比如: .frm , .par , .trn , .isl , .db.opt 等都在MySQL8.0中不存在了。
- 对比MyISAM的存储引擎, InnoDB写的处理效率差一些 ,并且会占用更多的磁盘空间以保存数据和索引。
- MyISAM只缓存索引,不缓存真实数据;InnoDB不仅缓存索引还要缓存真实数据, 对内存要求较高 ,而且内存大小对性能有决定性的影响。
4.2 MyISAM 引擎:主要的非事务处理存储引擎
- MyISAM提供了大量的特性,包括全文索引、压缩、空间函数(GIS)等,但MyISAM 不支持事务、行级锁、外键 ,有一个毫无疑问的缺陷就是 崩溃后无法安全恢复 。
- 5.5之前默认的存储引擎
- 优势是访问的 速度快 ,对事务完整性没有要求或者以SELECT、INSERT为主的应用
- 针对数据统计有额外的常数存储。故而 count(*) 的查询效率很高
- 数据文件结构:
- 表名.frm 存储表结构
- 表名.MYD 存储数据 (MYData)
- 表名.MYI 存储索引 (MYIndex)
- 应用场景:只读应用或者以读为主的业务
4.3 Archive 引擎:用于数据存档
- archive是归档的意思,仅仅支持插入和查询两种功能(行被插入后不能再修改)。
- 在MysQL5.5以后支持索引功能。
- 拥有很好的压缩机制,使用zlib压缩库,在记录请求的时候实时的进行压缩,经常被用来作为仓库使用。
- 创建ARCHIVE表时,存储引擎会创建名称以表名开头的文件。数据文件的扩展名为**,ARZ。**
- 根据英文的测试结论来看,同样数据量下,Archive表比MyISAM表要小大约75%,比支持事务处理的InnoDB表
- 小大约83%。
- ARCHIVE:存储引率采用了行级锁。该ARCHIVE引擎支持AUTO_INCREMENT列居性。AUTO_INCREMENT列可以
- 具有唯一索引或非唯一索引。尝试在任何其他列上创建索引会导致错误。
- Archive表适合日志和数好采集(档案)类应用:适合存储大量的独立的作为历史记录的数据。拥有很高的插入
- 速度,但是对查询的支持较差。
- 下表展示了ARCHIVE 存储引擎功能
4.4 Blackhole 引擎:丢弃写操作,读操作会返回空内容
- Blackhole引擎没有实现任何存储机制,它会丢弃所有插入的数据,不做任何供存
- 但服务器会记录Blackhole表的日志,所以可以用于复制数据到备库,或者简单地记录到日志。但这种应用方式会碰到很多问题,因此并不推荐。
4.5 CSV 引擎:存储数据时,以逗号分隔各个数据项
- CSV引擎可以将普通的CSV文件作为MySQL的表来处理,但不支持索引:
- CSv引擎可以作为一种数据交换的机制,非常有用。
- CSv存储的数据直接可以在操作系统里,用文本编辑器,或者exce读取。
- 对于数据的快速导入、导出是有明显优势的
创建CSV表时,服务器会创建一个纯文本数据文件,其名称以表名开头并带有.CSV扩展名。当你将数据存储到表中时,存储引将其以逗号分隔值格式保存到数据文件中。
使用案例如下
mysql> SELECT * FROM test;
+---+------------+
| i | c |
+---+------------+
| 1 | record one |
| 2 | record two |
+---+------------+
2 rows in set (0.00 sec)
创建CSV表还会创建相应的 元文件 ,用于 存储表的状态 和 表中存在的行数 。此文件的名称与表的名称相
同,后缀为 CSM 。如图所示
如果检查 test.CSV 通过执行上述语句创建的数据库目录中的文件,其内容使用Notepad++打开如下:
这种格式可以被 Microsoft Excel 等电子表格应用程序读取,甚至写入。使用Microsoft Excel打开如图所示
4.6 Memory 引擎:置于内存的表
概述:
Memory采用的逻辑介质是 内存 , 响应速度很快 ,但是当mysqld守护进程崩溃的时候 数据会丢失 。另外,要求存储的数据是数据长度不变的格式,比如,Blob和Text类型的数据不可用(长度不固定的)。
主要特征:
- Memory同时 支持哈希(HASH)索引 和 B+树索引 。
-
- 哈希索引相等的比较快,但是对于范围的比较慢很多。
- 默认使用哈希(HASH)素引,其速度要比使用B型树(BTREE)索引快。
- 如果希望使用B树索引,可以在创建索引时选择使用。
- Memory表至少比MyISAM表要 快一个数量级 。
- MEMORY 表的大小是受到限制 的。表的大小主要取决于两个参数,分别是 max_rows 和max_heap_table_size 。其中,max_rows可以在创建表时指定;max_heap_table_size的大小默认为16MB,可以按需要进行扩大。
- 数据文件与索引文件分开存储。
-
- 每个基于MEMORY存储引擎的表实际对应一个磁盘文件,该文件的文件名与表名相同,类型为frm类型,该文件中只存储表的结构,而其数据文件都是存储在内存中的。
- 这样有利于数据的快速处理,提供整个表的处理效率。
- 缺点:其数据易丢失,生命周期短。基于这个缺陷,选择MEMORY存储引擎时需要特别小心
使用Memory存储引擎的场景:
- 目标数据比较小 ,而且非常 频繁的进行访问 ,在内存中存放数据,如果太大的数据会造成 内存溢出 。可以通过参数 max_heap_table_size 控制Memory表的大小,限制Memory表的最大的大小。
- 如果 数据是临时的 ,而且 必须立即可用 得到,那么就可以放在内存中。
- 存储在Memory表中的数据如果突然间 丢失的话也没有太大的关系 。
4.7 Federated 引擎:访问远程表
- Federated引擎是访问其他MySQL服务器的一个 代理 ,尽管该引擎看起来提供了一种很好的 跨服务器的灵活性 ,但也经常带来问题,因此 默认是禁用的 。
4.8 Merge引擎:管理多个MyISAM表构成的表集合
4.9 NDB引擎:MySQL集群专用存储引擎
也叫做 NDB Cluster 存储引擎,主要用于 MySQL Cluster 分布式集群 环境,类似于 Oracle 的 RAC 集群。
4.10 引擎对比
MySQL中同一个数据库,不同的表可以选择不同的存储引擎。如下表对常用存储引擎做出了对比
其实这些东西大家没必要立即就给记住,列出来的目的就是想让大家明白不同的存储引擎支持不同的功能。
其实我们最常用的就是 InnoDB 和 MyISAM ,有时会提一下 Memory 。其中 InnoDB 是 MySQL 默认的存储引擎
5. MyISAM和InnoDB
很多人对 InnoDB 和 MyISAM 的取舍存在疑问,到底选择哪个比较好呢?
MySQL5.5之前的默认存储引擎是MyISAM,5.5之后改为了InnoDB。
- 首先对于InnoDB存储引擎,提供了良好的事务管理、崩溃修复能力和并发控制。因为InnoDB存储引擎支持事务,所以对于要求事务完整性的场合需要选择InnoDB,比如数据操作除了插入和查询以外还包含有很多更新、删除操作,像财务系统等对数据准确性要求较高的系统。缺点是其读写效率稍差,占用的数据空间相对比较大。
- 其次对于MyISAM存储引擎,如果是小型应用,系统以读操作和插入操作为主,只有很少的更新、删除操作,并且对事务的要求没有那么高,则可以选择这个存储引擎。MyISAM存储引擎的优势在于占用空间小,处理速度快;缺点是不支持事务的完整性和并发性。
- 这两种引擎各有特点,当然你也可以在MySQL中,针对不同的数据表,可以选择不同的存储引擎。
6. 阿里巴巴、淘宝用哪个
- Percona 为 MySQL 数据库服务器进行了改进,在功能和性能上较 MySQL 有很显著的提升。
- 该版本提升了在高负载情况下的 InnoDB 的性能、为 DBA 提供一些非常有用的性能诊断工具;另外有更多的参数和命令来控制服务器行为。
- 该公司新建了一款存储引擎叫 Xtradb 完全可以替代 Innodb ,并且在性能和并发上做得更好
- 阿里巴巴大部分mysql数据库其实使用的percona的原型加以修改。
补充:
1、InnoDB表的优势
- InnoDB存储引擎在实际应用中拥有诸多优势,比如操作便利、提高了数据库的性能、维护成本低等。如果由于硬件或软件的原因导致服务器崩溃,那么在重启服务器之后不需要进行额外的操作。InnoDB崩溃恢复功能自动将之前提交的内容定型,然后撤销没有提交的进程,重启之后继续从崩溃点开始执行。
- InnoDB存储引擎在主内存中维护缓冲池,高频率使用的数据将在内存中直接被处理。这种缓存方式应用于多种信息,加速了处理进程。
- 在专用服务器上,物理内存中高达80%的部分被应用于缓冲池。如果需要将数据插入不同的表中,可以设置外键加强数据的完整性。更新或者删除数据,关联数据将会被自动更新或删除。如果试图将数据插入从表,但在主表中没有对应的数据,插入的数据将被自动移除。如果磁盘或内存中的数据出现崩溃,在使用脏数据之前,校验和机制会发出警告。当每个表的主键都设置合理时,与这些列有关的操作会被自动优化。插入、更新和删除操作通过做改变缓冲自动机制进行优化。 InnoDB不仅支持当前读写,也会缓冲改变的数据到数据流磁盘 。
- InnoDB的性能优势不只存在于长时运行查询的大型表。在同一列多次被查询时,自适应哈希索引会提高查询的速度。使用InnoDB可以压缩表和相关的索引,可以 在不影响性能和可用性的情况下创建或删除索引 。对于大型文本和BLOB数据,使用动态行形式,这种存储布局更高效。通过查询
- INFORMATION_SCHEMA库中的表可以监控存储引擎的内部工作。在同一个语句中,InnoDB表可以与其他存储引擎表混用。即使有些操作系统限制文件大小为2GB,InnoDB仍然可以处理。 当处理大数据量时,InnoDB兼顾CPU,以达到最大性能 。
2、InnoDB和ACID模型
ACID模型是一系列数据库设计规则,这些规则着重强调可靠性,而可靠性对于商业数据和任务关键型应用非常重要。MySQL包含类似InnoDB存储引擎的组件,与ACID模型紧密相连,这样出现意外时,数据不会崩溃,结果不会失真。如果依赖ACID模型,可以不使用一致性检查和崩溃恢复机制。如果拥有额外的软件保护,极可靠的硬件或者应用可以容忍一小部分的数据丢失和不一致,可以将MySQL设置调整为只依赖部分ACID特性,以达到更高的性能。下面讲解InnoDB存储引擎与ACID模型相同作用的四个方面。
- 原子方面 ACID的原子方面主要涉及InnoDB事务,与MySQL相关的特性主要包括:
-
- 自动提交设置。
COMMIT语句。
ROLLBACK语句。
操作INFORMATION_SCHEMA库中的表数据。
- 一致性方面 ACID模型的一致性主要涉及保护数据不崩溃的内部InnoDB处理过程,与MySQL相关的特性主要包括:
-
- InnoDB双写缓存。
- InnoDB崩溃恢复。
- 隔离方面 隔离是应用于事务的级别,与MySQL相关的特性主要包括:
-
- 自动提交设置。
- SET ISOLATION LEVEL语句。
- InnoDB锁的低级别信息。
- 耐久性方面 ACID模型的耐久性主要涉及与硬件配置相互影响的MySQL软件特性。由于硬件复杂多样化,耐久性方面没有具体的规则可循。与MySQL相关的特性有:
-
- InnoDB双写缓存,通过innodb_doublewrite配置项配置。
- 配置项innodb_flush_log_at_trx_commit。
- 配置项sync_binlog。
- 配置项innodb_file_per_table。
- 存储设备的写入缓存。
- 存储设备的备用电池缓存。
- 运行MySQL的操作系统。
- 持续的电力供应。
- 备份策略。
- 对分布式或托管的应用,最主要的在于硬件设备的地点以及网络情况。
3、InnoDB架构
- 缓冲池 缓冲池是主内存中的一部分空间,用来缓存已使用的表和索引数据。缓冲池使得经常被使用的数据能够直接在内存中获得,从而提高速度。
- 更改缓存 更改缓存是一个特殊的数据结构,当受影响的索引页不在缓存中时,更改缓存会缓存辅助索引页的更改。索引页被其他读取操作时会加载到缓存池,缓存的更改内容就会被合并。不同于集群索引,辅助索引并非独一无二的。当系统大部分闲置时,清除操作会定期运行,将更新的索引页刷入磁盘。更新缓存合并期间,可能会大大降低查询的性能。在内存中,更新缓存占用一部分InnoDB缓冲池。在磁盘中,更新缓存是系统表空间的一部分。更新缓存的数据类型由innodb_change_buffering配置项管理。
- 自适应哈希索引 自适应哈希索引将负载和足够的内存结合起来,使得InnoDB像内存数据库一样运行,不需要降低事务上的性能或可靠性。这个特性通过innodb_adaptive_hash_index选项配置,或者通过–skip-innodb_adaptive_hash_index命令行在服务启动时关闭。
- 重做日志缓存 重做日志缓存存放要放入重做日志的数据。重做日志缓存大小通过innodb_log_buffer_size配置项配置。重做日志缓存会定期地将日志文件刷入磁盘。大型的重做日志缓存使得大型事务能够正常运行而不需要写入磁盘。
- 系统表空间 系统表空间包括InnoDB数据字典、双写缓存、更新缓存和撤销日志,同时也包括表和索引数据。多表共享,系统表空间被视为共享表空间。
- 双写缓存 双写缓存位于系统表空间中,用于写入从缓存池刷新的数据页。只有在刷新并写入双写缓存后,InnoDB才会将数据页写入合适的位置。
- 撤销日志 撤销日志是一系列与事务相关的撤销记录的集合,包含如何撤销事务最近的更改。如果其他事务要查询原始数据,可以从撤销日志记录中追溯未更改的数据。撤销日志存在于撤销日志片段中,这些片段包含于回滚片段中。
- 每个表一个文件的表空间 每个表一个文件的表空间是指每个单独的表空间创建在自身的数据文件中,而不是系统表空间中。这个功能通过innodb_file_per_table配置项开启。每个表空间由一个单独的.ibd数据文件代表,该文件默认被创建在数据库目录中。
- 通用表空间 使用CREATE TABLESPACE语法创建共享的InnoDB表空间。通用表空间可以创建在MySQL数据目录之外能够管理多个表并支持所有行格式的表。
- 撤销表空间 撤销表空间由一个或多个包含撤销日志的文件组成。撤销表空间的数量由innodb_undo_tablespaces配置项配置。
- 临时表空间 用户创建的临时表空间和基于磁盘的内部临时表都创建于临时表空间。innodb_temp_data_file_path配置项定义了相关的路径、名称、大小和属性。如果该值为空,默认会在innodb_data_home_dir变量指定的目录下创建一个自动扩展的数据文件。
- 重做日志 重做日志是基于磁盘的数据结构,在崩溃恢复期间使用,用来纠正数据。正常操作期间,重做日志会将请求数据进行编码,这些请求会改变InnoDB表数据。遇到意外崩溃后,未完成的更改会自动在初始化期间重新进行。