第十二章 数据库存储引擎
1.存储引擎
存储引擎是数据库底层的组件,是数据库的核心。 使用存储引擎可以创建、查询、更新、删除数据库。存储引擎可以理解为数据库的操作系统,不同的存储引擎提供的存储方式、索引机制等也不相同,就像Windows系统和Mac系统一样。在数据库开发时,为了提高MySQL的灵活性和高效性,可以根据实际情况来选择存储引擎。

2.MySQL的存储引擎
MySQL支持多种不同的存储引擎,包括处理事务安全表的引擎和处理非事务安全表的引擎。在MySQL中不需要使用同样的引擎,根据对数据处理的不同需求而选择合适的存储引擎不仅可以提高数据存储和检索的效率,还可以降低高并发情况下的数据压力。在系统中可以使用SHOW ENGINES语句查看所支持的引擎类型,具体操作方法如下。
MariaDB [(none)]> show engines \G
*************************** 1. row ***************************
Engine: MEMORY
Support: YES
Comment: Hash based, stored in memory, useful for temporary tables
Transactions: NO
XA: NO
Savepoints: NO
*************************** 2. row ***************************
Engine: MRG_MyISAM
Support: YES
Comment: Collection of identical MyISAM tables
Transactions: NO
XA: NO
Savepoints: NO
*************************** 3. row ***************************
Engine: CSV
Support: YES
Comment: Stores tables as CSV files
Transactions: NO
XA: NO
Savepoints: NO
*************************** 4. row ***************************
Engine: BLACKHOLE
Support: YES
Comment: /dev/null storage engine (anything you write to it disappears)
Transactions: NO
XA: NO
Savepoints: NO
*************************** 5. row ***************************
Engine: MyISAM
Support: YES
Comment: Non-transactional engine with good performance and small data footprint
Transactions: NO
XA: NO
Savepoints: NO
*************************** 6. row ***************************
Engine: ARCHIVE
Support: YES
Comment: gzip-compresses tables for a low storage footprint
Transactions: NO
XA: NO
Savepoints: NO
*************************** 7. row ***************************
Engine: FEDERATED
Support: YES
Comment: Allows to access tables on other MariaDB servers, supports transactions and more
Transactions: YES
XA: NO
Savepoints: YES
*************************** 8. row ***************************
Engine: PERFORMANCE_SCHEMA
Support: YES
Comment: Performance Schema
Transactions: NO
XA: NO
Savepoints: NO
*************************** 9. row ***************************
Engine: SEQUENCE
Support: YES
Comment: Generated tables filled with sequential values
Transactions: YES
XA: NO
Savepoints: YES
*************************** 10. row ***************************
Engine: OQGRAPH
Support: YES
Comment: Open Query Graph Computation Engine (http://openquery.com/graph)
Transactions: NO
XA: NO
Savepoints: NO
*************************** 11. row ***************************
Engine: Aria
Support: YES
Comment: Crash-safe tables with MyISAM heritage
Transactions: NO
XA: NO
Savepoints: NO
*************************** 12. row ***************************
Engine: InnoDB
Support: DEFAULT
Comment: Supports transactions, row-level locking, foreign keys and encryption for tables
Transactions: YES
XA: YES
Savepoints: YES
12 rows in set (0.002 sec)

MariaDB [(none)]>
在上方的MySQL信息中,Engine列表示所支持的存储引擎,Support 列表示存储引擎是否可以被使用,其中“YES”表示可以使用,“NO”表示不能使用,“DEFAULT”表示为当前数据库默认的存储引擎。

3.MyISAM和InnoDB两者概念
MyISAM是MySQL的默认数据库引擎(5.5版之前),由早期的ISAM(Indexed Sequential Access Method:有索引的顺序访问方法)所改良。虽然性能极佳,但却有一个缺点:不支持事务处理(transaction)。不过,在这几年的发展下,MySQL也导入了InnoDB(另一种数据库引擎),以强化参考完整性与并发违规处理机制,后来就逐渐取代MyISAM。

InnoDB,是MySQL的数据库引擎之一,为MySQL AB发布binary的标准之一。InnoDB由Innobase Oy公司所开发,2006年五月时由甲骨文公司并购。与传统的ISAM与MyISAM相比,InnoDB的最大特色就是支持了ACID兼容的事务(Transaction)功能,类似于PostgreSQL。目前InnoDB采用双轨制授权,一是GPL授权,另一是专有软件授权。

4.存储引擎概念介绍
MySQL中的数据用各种不同的技术存储在文件中,每一种技术都使用不同的存储机制、索引技巧、锁定水平并最终提供不同的功能和能力,这些不同的技术以及配套的功能在MySQL中称为存储引擎;存储引擎是MySQL将数据存储在文件系统中的存储方式或者存储格式;MySQL常用的存储引擎 MyISAM ,InnoDB;MySQL数据库中的组件,负责执行实际的数据I/O操作;MySQL系统中,存储引擎处于文件系统之上,在数据保存到数据文件之前会传输到存储引擎,之后按照各个存储引擎的存储格式进行存储。

5.MyISAM的介绍
MyISAM不支持事务,也不支持外键;访问速度快;对事务完整性没有要求。
MyISAM在磁盘上存储成三个文件:.frm文件存储表定义 ;数据文件的扩展名为.MYD (MYData) ;索引文件的扩展名是.MYI (MYIndex); 表级锁定形式,数据在更新时锁定整个表 ,数据库在读写过程中相互阻塞;会在数据写入的过程阻塞用户数据的读取 ,也会在数据读取的过程中阻塞用户的数据写入 ,数据单独写入或读取,速度过程较快且占用资源相对少。
MyIAM支持的存储格式:静态表;动态表 ;压缩表。

6.MyIAM支持的存储格式
静态表是默认的存储格式。静态表中的字段都是非可变字段,这样每个记录都是固定长度的,这种存储方式的优点是存储非常迅速,容易缓存,出现故障容易恢复;缺点是占用的空间通常比动态表多。静态表在数据存储时会根据列定义的宽度定义补足空格,但是在访问的时候并不会得到这些空格,这些空榕在返回给应用之前已经去掉。同时需要注意:在某些情况下可能需要返回字段后的空格,而使用这种格式时后面的空格会被自动处理掉。

动态表包含可变字段,记录不是固定长度的,这样存储的优点是占用空间较少,但是频繁的更新、删除记录会产生碎片,需要定期执行OPTIMIZE TABLE语句或myisamchk -r命令来改善性能,并且出现故障的时候恢复相对比较困难。压缩表由myisamchk工具创建,占据非常小的空间,因为每条记录都是被单独压缩的,所以只有非常小的访问开支。

7.MyISAM适用的生产场景举例
公司业务不需要事务的支持 ,单方面读取或写入数据比较多的业务 ,MyISAM存储引擎数据读写都比较频繁场景不适合,使用读写并发访问相对较低的业务 ,数据修改相对较少的业务 ,对数据业务一致性要求不是非常高的业务 ,服务器硬件资源相对比较差。

8.InnoDB特点介绍
支持4个事务隔离级别 ,行级锁定,但是全表扫描仍然会是表级锁定,读写阻塞与事务隔离级别相关,能非常高效的缓存索引和数据,表与主键以簇的方式存储,支持分区、表空间,类似oracle数据库。

分区 就是把一-张表的数据分成N个区块,在逻辑上看最终只是一张表,但底层是由N个物理区块组成的。

分表 就是把一张表按一定的规则分解成N个具有独立存储空间的实体表。系统读写时需要根据定义好的规则得到对应的字表明,然后操作它。

分库 一旦分表,一个库中的表会越来越多。

表空间是数据库的逻辑划分,一个表空间只能属于一个数据库。所有的数据库对象都存放在指定的表空间中。但主要存放的是表,所以称作表空间。 一个数据库可以包含多个表空间,一个表空间只能属于一个数据库 ,一个表空间包含多个数据文件,一个数据文件只能属于一个表空间,支持外键约束,5.5前不支持全文索引,5.5后支持全文索引,对硬件资源要求还是比较高的场合

8.1、InnoDB适用生产场景分析
业务需要事务的支持,行级锁定对高并发有很好的适应能力,但需确保查询是通过索引来完成,业务数据更新较为频繁的场景。如:论坛,微博等,业务数据一致性要求较高 。如:银行业务,硬件设备内存较大,利用Innodb较好的缓存能力来提高内存利用率,减少磁盘IO的压力。

8.2、企业选择存储引擎依据
需要考虑每个存储引擎提供的核心功能及应用场景,支持的字段和数据类型,所有引擎都支持通用的数据类型 ,但不是所有的引擎都支持其它的字段类型,如二进制对象,锁定类型:不同的存储引擎支持不同级别的锁定,表锁定,行锁定。索引的支持,建立索引在搜索和恢复数据库中的数据时能显著提高性能 ,不同的存储引擎提供不同的制作索引的技术,有些存储引擎根本不支持索引。事务处理的支持 ,提高在向表中更新和插入信息期间的可靠性 ,可根据企业业务是否要支持事务选择存储引擎。

9.MyISAM和InnoDB区别
9.1区别
截屏20220309 上午11.20.27.png
9.2 名词解释
表级锁:直接锁定整张表,在锁定期间,其他进程无法对该表进行写操作,如果设置的是写锁,那么其他进程读也不允许,因此myisam支持的并发量低,但myisam不会出现死锁;
行级锁:只对指定的行进行锁定,其他进程还是可以对表中的其他行进行操作的。因此行锁能大大的减少数据库操作的冲突,但有时会导致死锁。
全文索引:指对char、varchar和text中的每个词(停用词除外)建立倒排序索引。MyISAM的全文索引其实没啥用,因为它不支持中文分词,必须由使用者分词后加入空格再写到数据表里,而且少于4个汉字的词会和停用词一样被忽略掉。

9.3 不同版本对应默认引擎
在MySQL 5.1之前的版本中,默认的搜索引擎是MyISAM,从MySQL 5.5之后的版本中,默认的搜索引擎变更为InnoDB。

9.4 如何选择
因为MyISAM相对简单所以在效率上要优于InnoDB.如果系统读多,写少。对原子性要求低。那么MyISAM最好的选择。且MyISAM恢复速度快。可直接用备份覆盖恢复。 如果系统读少,写多的时候,尤其是并发写入高的时候。InnoDB就是首选了。

9.5 存储结构
MyISAM:每个MyISAM在磁盘上存储成三个文件。第一个文件的名字以表的名字开始,扩展名指出文件类型。.frm文件存储表定义。数据文件的扩展名为.MYD (MYData)。索引文件的扩展名是.MYI (MYIndex)。
InnoDB:所有的表都保存在同一个数据文件中(也可能是多个文件,或者是独立的表空间文件),InnoDB表的大小只受限于操作系统文件的大小,一般为2GB。

9.6 存储空间
MyISAM:可被压缩,存储空间较小。支持三种不同的存储格式:静态表(默认,但是注意数据末尾不能有空格,会被去掉)、动态表、压缩表。
InnoDB:需要更多的内存和存储,它会在主内存中建立其专用的缓冲池用于高速缓冲数据和索引。

9.7 可移植性、备份及恢复
MyISAM:数据是以文件的形式存储,所以在跨平台的数据转移中会很方便。在备份和恢复时可单独针对某个表进行操作。
InnoDB:免费的方案可以是拷贝数据文件、备份 binlog,或者用mysqldump,在数据量达到几十G的时候就相对痛苦了。

9.8 事务支持
MyISAM:强调的是性能,每次查询具有原子性,其执行数度比InnoDB类型更快,但是不提供事务支持。
InnoDB:提供事务支持事务,外部键等高级数据库功能。 具有事务(commit)、回滚(rollback)和崩溃修复能力(crash recovery capabilities)的事务安全(transaction-safe (ACID compliant))型表。

9.9 AUTO_INCREMENT
MyISAM:可以和其他字段一起建立联合索引。引擎的自动增长列必须是索引,如果是组合索引,自动增长可以不是第一列,他可以根据前面几列进行排序后递增。
InnoDB:InnoDB中必须包含只有该字段的索引。引擎的自动增长列必须是索引,如果是组合索引也必须是组合索引的第一列。

9.10 表锁差异
MyISAM:只支持表级锁,用户在操作myisam表时,select,update,delete,insert语句都会给表自动加锁,如果加锁以后的表满足insert并发的情况下,可以在表的尾部插入新的数据。
InnoDB:支持事务和行级锁,是innodb的最大特色。行锁大幅度提高了多用户并发操作的新能。但是InnoDB的行锁,只是在WHERE的主键是有效的,非主键的WHERE都会锁全表的。

9.11 全文索引
MyISAM:支持 FULLTEXT类型的全文索引。
InnoDB:不支持FULLTEXT类型的全文索引,但是innodb可以使用sphinx插件支持全文索引,并且效果更好。

9.12 表主键
MyISAM:允许没有任何索引和主键的表存在,索引都是保存行的地址。
InnoDB:如果没有设定主键或者非空唯一索引,就会自动生成一个6字节的主键(用户不可见),数据是主索引的一部分,附加索引保存的是主索引的值。

9.13 表的具体行数
MyISAM:保存有表的总行数,如果select count() from table;会直接取出出该值。
InnoDB:没有保存表的总行数,如果使用select count(
) from table;就会遍历整个表,消耗相当大,但是在加了wehre条件后,myisam和innodb处理的方式都一样。

9.14CURD操作
MyISAM:如果执行大量的SELECT,MyISAM是更好的选择。
InnoDB:如果你的数据执行大量的INSERT或UPDATE,出于性能方面的考虑,应该使用InnoDB表。DELETE 从性能上InnoDB更优,但DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除,在innodb上如果要清空保存有大量数据的表,最好使用truncate table这个命令。

9.15 外键
MyISAM:不支持
InnoDB:支持
通过上述的分析,基本上可以考虑使用InnoDB来替代MyISAM引擎了,原因是InnoDB自身很多良好的特点,比如事务支持、存储 过程、视图、行级锁定等等,在并发很多的情况下,相信InnoDB的表现肯定要比MyISAM强很多。另外,任何一种表都不是万能的,只用恰当的针对业务类型来选择合适的表类型,才能最大的发挥MySQL的性能优势。如果不是很复杂的Web应用,非关键应用,还是可以继续考虑MyISAM的,这个具体情况可以自己斟酌。

10.MyISAM和InnoDB讲解
InnoDB和MyISAM是许多人在使用MySQL时最常用的两个表类型,这两个表类型各有优劣,视具体应用而定。基本的差别为:MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持。MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持,而InnoDB提供事务支持以及外部键等高级数据库功能。

以下是一些细节和具体实现的差别:
1.InnoDB不支持FULLTEXT类型的索引。
2.InnoDB 中不保存表的具体行数,也就是说,执行select count() from table时,InnoDB要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行数即可。注意的是,当count()语句包含 where条件时,两种表的操作是一样的。
3.对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中,可以和其他字段一起建立联合索引。
4.DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除。
5.LOAD TABLE FROM MASTER操作对InnoDB是不起作用的,解决方法是首先把InnoDB表改成MyISAM表,导入数据后再改成InnoDB表,但是对于使用的额外的InnoDB特性(例如外键)的表不适用。
另外,InnoDB表的行锁也不是绝对的,假如在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表,例如update table set num=1 where name like “%aaa%”
两种类型最主要的差别就是Innodb 支持事务处理与外键和行级锁。而MyISAM不支持.所以MyISAM往往就容易被人认为只适合在小项目中使用。作为使用MySQL的用户角度出发,Innodb和MyISAM都是比较喜欢的,如果数据库平台要达到需求:99.9%的稳定性,方便的扩展性和高可用性来说的话,MyISAM绝对是首选。
原因如下:
1、平台上承载的大部分项目是读多写少的项目,而MyISAM的读性能是比Innodb强不少的。
2、MyISAM的索引和数据是分开的,并且索引是有压缩的,内存使用率就对应提高了不少。能加载更多索引,而Innodb是索引和数据是紧密捆绑的,没有使用压缩从而会造成Innodb比MyISAM体积庞大不小。
3、经常隔1,2个月就会发生应用开发人员不小心update一个表where写的范围不对,导致这个表没法正常用了,这个时候MyISAM的优越性就体现出来了,随便从当天拷贝的压缩包取出对应表的文件,随便放到一个数据库目录下,然后dump成sql再导回到主库,并把对应的binlog补上。如果是Innodb,恐怕不可能有这么快速度,别和我说让Innodb定期用导出xxx.sql机制备份,因为最小的一个数据库实例的数据量基本都是几十G大小。
4、从接触的应用逻辑来说,select count() 和order by 是最频繁的,大概能占了整个sql总语句的60%以上的操作,而这种操作Innodb其实也是会锁表的,很多人以为Innodb是行级锁,那个只是where对它主键是有效,非主键的都会锁全表的。
5、还有就是经常有很多应用部门需要我给他们定期某些表的数据,MyISAM的话很方便,只要发给他们对应那表的frm.MYD,MYI的文件,让他们自己在对应版本的数据库启动就行,而Innodb就需要导出xxx.sql了,因为光给别人文件,受字典数据文件的影响,对方是无法使用的。
6、如果和MyISAM比insert写操作的话,Innodb还达不到MyISAM的写性能,如果是针对基于索引的update操作,虽然MyISAM可能会逊色Innodb,但是那么高并发的写,从库能否追的上也是一个问题,还不如通过多实例分库分表架构来解决。
7、如果是用MyISAM的话,merge引擎可以大大加快应用部门的开发速度,他们只要对这个merge表做一些select count(
)操作,非常适合大项目总量约几亿的rows某一类型(如日志,调查统计)的业务表。
当然Innodb也不是绝对不用,用事务的项目就用Innodb的。另外,可能有人会说你MyISAM无法抗太多写操作,但是可以通过架构来弥补。

修改存储引擎
方法1: alter table修改
alter table table_ name engine=引擎;
例:
mysql> show engines\G 查看存储引擎
mysql> show create table stu\G 查看表stu的状态信息
mysql> alter table stu engine=MyISAM; 修改表stu的存储引擎
mysql> show create table stu\G 查看表stu的状态信息
图片 1.png
图片 2.png

方法2: 修改my.cnf,指定默认存储引擎并重启服务
default- storage-engine=InnoDB
例:mysql> exit 退出数据库
[root@mysql1 ~]# vi /etc/my.cnf 编辑配置文件
添加
default-storage-engine=MyISAM
[root@mysql1 ~]# systemctl restart mysqld 重启服务
[root@mysql1 ~]# mysql -uroot -p123456 登录数据库
mysql> show engines\G 查看存储引擎的状态
图片 3.png
图片 4.png

方法3: create table创建表时指定存储引擎
create table表名
(字段) engine=引擎
例:
mysql> create table aa.t1(id int(1)) engine=InnoDB; #创建表修改存储引擎类型
Query OK, 0 rows affected (0.01 sec)
mysql> create table aa.b1(id int(1)); #默认引擎类型
Query OK, 0 rows affected (0.01 sec)
mysql> show create table aa.t1\G #查看指定表的存储引擎
mysql> show create table aa.b1\G
图片 5.png

MySQL存储引擎的配置
1.登入MySQL服务器,执行SHOW ENGINES\G指令可列表查看,MySQL5.6可用的存储引擎有12种(除最后的FEDERATED以外,其他11种都支持),其中默认采用的存储引擎为InnoDB。
[root@localhost ~]# mysql  -u root -p
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 19
Server version: 10.3.17-MariaDB MariaDB Server
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]>
MariaDB [(none)]> show engines\G
*************************** 1. row ***************************
      Engine: MEMORY
     Support: YES
     Comment: Hash based, stored in memory, useful for temporary tables
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 2. row ***************************
      Engine: MRG_MyISAM
     Support: YES
     Comment: Collection of identical MyISAM tables
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 3. row ***************************
      Engine: CSV
     Support: YES
     Comment: Stores tables as CSV files
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 4. row ***************************
      Engine: BLACKHOLE
     Support: YES
     Comment: /dev/null storage engine (anything you write to it disappears)
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 5. row ***************************
      Engine: MyISAM
     Support: YES
     Comment: Non-transactional engine with good performance and small data footprint
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 6. row ***************************
      Engine: ARCHIVE
     Support: YES
     Comment: gzip-compresses tables for a low storage footprint
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 7. row ***************************
      Engine: FEDERATED
     Support: YES
     Comment: Allows to access tables on other MariaDB servers, supports transactions and more
Transactions: YES
          XA: NO
  Savepoints: YES
*************************** 8. row ***************************
      Engine: PERFORMANCE_SCHEMA
     Support: YES
     Comment: Performance Schema
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 9. row ***************************
      Engine: SEQUENCE
     Support: YES
     Comment: Generated tables filled with sequential values
Transactions: YES
          XA: NO
  Savepoints: YES
*************************** 10. row ***************************
      Engine: OQGRAPH
     Support: YES
     Comment: Open Query Graph Computation Engine (http://openquery.com/graph)
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 11. row ***************************
      Engine: Aria
     Support: YES
     Comment: Crash-safe tables with MyISAM heritage
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 12. row ***************************
      Engine: InnoDB
     Support: DEFAULT
     Comment: Supports transactions, row-level locking, foreign keys and encryption for tables
Transactions: YES
          XA: YES
  Savepoints: YES
12 rows in set (0.001 sec)
MariaDB [(none)]>
2.查看系统变量default_storage_engine的值,确认默认采用的存储引擎是InnoDB。
MariaDB [(none)]> show variables like 'default_storage_engine';
+------------------------+--------+
| Variable_name          | Value  |
+------------------------+--------+
| default_storage_engine | InnoDB |
+------------------------+--------+
1 row in set (0.001 sec)
MariaDB [(none)]>
3.在mysql>环境中,可以直接通过SET指令更改默认的存储引擎(只在本次连接会话过程中有效,退出重进即失效)。比如临时修改为MyISAM,可执行下列操作。
MariaDB [(none)]> set default_storage_engine=MyISAM;
Query OK, 0 rows affected (0.000 sec)
MariaDB [(none)]> show variables like 'default_storage_engine';
+------------------------+--------+
| Variable_name          | Value  |
+------------------------+--------+
| default_storage_engine | MyISAM |
+------------------------+--------+
1 row in set (0.001 sec)
MariaDB [(none)]>
4.若希望直接修改MySQL服务程序所采用的默认存储引擎,应将相关设置写入配置文件/etc/my.cnf,并重启服务后生效,重新登入mysql>确认修改结果。
MariaDB [(none)]> exit
Bye
[root@localhost ~]#
[root@localhost ~]# vim  /etc/my.cnf.d/mariadb-server.cnf 
     1  #
     2  # These groups are read by MariaDB server.
     3  # Use it for options that only the server (but not clients) should see
     4  #
     5  # See the examples of server my.cnf files in /usr/share/mysql/
     6  #
     7  
     8  # this is read by the standalone daemon and embedded servers
     9  [server]
    10  
    11  # this is only for the mysqld standalone daemon
    12  # Settings user and group are ignored when systemd is used.
    13  # If you need to run mysqld under a different user or group,
    14  # customize your systemd unit file for mysqld/mariadb according to the
    15  # instructions in http://fedoraproject.org/wiki/Systemd
    16  [mysqld]
    17  datadir=/var/lib/mysql
    18  socket=/var/lib/mysql/mysql.sock
    19  log-error=/var/log/mariadb/mariadb.log
    20  pid-file=/run/mariadb/mariadb.pid
    21  default_storage_engine=MEMORY              //手动添加
    22  
   。。。。。。。。省略
    55  [mariadb-10.3]
56  
:wq!
[root@localhost ~]# systemctl restart mariadb.service
[root@localhost ~]# mysql -uroot -p
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 8
Server version: 10.3.17-MariaDB MariaDB Server
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]> show variables like 'default_storage_engine';
+------------------------+--------+
| Variable_name          | Value  |
+------------------------+--------+
| default_storage_engine | MEMORY |
+------------------------+--------+
1 row in set (0.001 sec)
MariaDB [(none)]>
5.为了避免后续试验障碍,测试完后记得恢复原状——移除默认引擎设置,或者将其修改为InnoDB即可,确认恢复结果(选项-e可调用指定的SQL操作后返回Shell命令行)。
MariaDB [(none)]> exit
Bye
[root@localhost ~]#
[root@localhost ~]# vim  /etc/my.cnf.d/mariadb-server.cnf 
     1  #
     2  # These groups are read by MariaDB server.
     3  # Use it for options that only the server (but not clients) should see
     4  #
     5  # See the examples of server my.cnf files in /usr/share/mysql/
     6  #
     7  
     8  # this is read by the standalone daemon and embedded servers
     9  [server]
    10  
    11  # this is only for the mysqld standalone daemon
    12  # Settings user and group are ignored when systemd is used.
    13  # If you need to run mysqld under a different user or group,
    14  # customize your systemd unit file for mysqld/mariadb according to the
    15  # instructions in http://fedoraproject.org/wiki/Systemd
    16  [mysqld]
    17  datadir=/var/lib/mysql
    18  socket=/var/lib/mysql/mysql.sock
    19  log-error=/var/log/mariadb/mariadb.log
    20  pid-file=/run/mariadb/mariadb.pid
    21  default_storage_engine=InnoDB             //手动添加修改或者移除
    22  
   。。。。。。。。省略
    55  [mariadb-10.3]
56  
:wq!
[root@localhost ~]# systemctl restart mariadb.service
[root@localhost ~]# mysql -u root -p -e "show variables like 'default_storage_engine';"
Enter password: 
+------------------------+--------+
| Variable_name          | Value  |
+------------------------+--------+
| default_storage_engine | InnoDB |
+------------------------+--------+
[root@localhost ~]#
6.使用show table status 命令可以查看mysql库中的user表正在使用的存储引擎是什么类型
[root@localhost ~]# mysql -uroot -p
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 10
Server version: 10.3.17-MariaDB MariaDB Server
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| runtime            |
| runtimeedu         |
+--------------------+
5 rows in set (0.001 sec)
MariaDB [(none)]> show table status from mysql where name='user';
+------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+------------+-----------+----------+----------------+-----------------------------+--------------------+-----------+
| Name | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time         | Update_time         | Check_time | Collation | Checksum | Create_options | Comment                     | Max_index_length   | Temporary |
+------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+------------+-----------+----------+----------------+-----------------------------+--------------------+-----------+
| user | MyISAM |      10 | Dynamic    |    3 |            114 |         472 | 281474976710655 |         4096 |       128 |           NULL | 2021-01-18 01:58:59 | 2021-01-18 01:59:45 | NULL       | utf8_bin  |     NULL |                | Users and global privileges | 288230376151710720 | N         |
+------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+------------+-----------+----------+----------------+-----------------------------+--------------------+-----------+
1 row in set (0.001 sec)
MariaDB [(none)]>
7.创建一个test库,在库中创建一个user表,并查看默认存储引擎是什么类型
MariaDB [(none)]> create database test;
Query OK, 1 row affected (0.000 sec)
MariaDB [(none)]> use test;
Database changed
MariaDB [test]> create table user(id int);
Query OK, 0 rows affected (0.003 sec)
MariaDB [test]> show create table user;
+-------+------------------------------------------------------------------------------------------+
| Table | Create Table                                                                             |
+-------+------------------------------------------------------------------------------------------+
| user  | CREATE TABLE `user` (
  `id` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+-------+------------------------------------------------------------------------------------------+
1 row in set (0.000 sec)
MariaDB [test]>
8.在test库中创建一个passwd表时指定存储引擎为MyISAM
MariaDB [test]> create table passwd(id int)engine=MyISAM;
Query OK, 0 rows affected (0.001 sec)
MariaDB [test]> show create table passwd;
+--------+--------------------------------------------------------------------------------------------+
| Table  | Create Table                                                                               |
+--------+--------------------------------------------------------------------------------------------+
| passwd | CREATE TABLE `passwd` (
  `id` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 |
+--------+--------------------------------------------------------------------------------------------+
1 row in set (0.000 sec)
MariaDB [test]>
上一篇 下一篇