Mysql引擎MyIsam与InnoDB

Mysql引擎MyIsam与InnoDB

存储引擎是第一个表存储、组织数据的一个方式,不同的引擎存储数据的方式不一样。

查看表的引擎

show create table +  表名

mysql> show create table user;
+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                                                                                                                                                                                            |
+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| user  | CREATE TABLE `user` (
  `user_id` int(11) NOT NULL,
  `password` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
  `username` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
  PRIMARY KEY (`user_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC |
+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.01 sec)
在后面可以看到engine = InnoDB

建表的时候可以指定数据表的存储引擎以及字符方式,默认引擎为InnoDB,默认的编码方式为utf8;

查看mysq支持哪些引擎

show engines \G;

mysql> 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: CSV storage engine
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 4. row ***************************
      Engine: FEDERATED
     Support: NO
     Comment: Federated MySQL storage engine
Transactions: NULL
          XA: NULL
  Savepoints: NULL
*************************** 5. row ***************************
      Engine: PERFORMANCE_SCHEMA
     Support: YES
     Comment: Performance Schema
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 6. row ***************************
      Engine: MyISAM
     Support: YES
     Comment: MyISAM storage engine
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 7. row ***************************
      Engine: InnoDB
     Support: DEFAULT
     Comment: Supports transactions, row-level locking, and foreign keys
Transactions: YES
          XA: YES
  Savepoints: YES
*************************** 8. row ***************************
      Engine: BLACKHOLE
     Support: YES
     Comment: /dev/null storage engine (anything you write to it disappears)
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)

mysql支持9大引擎,不同版本的mysql对引擎支持情况不一样,8.0只支持8个。

MYISAM存储引擎

它管理的表有以下特征:

​ 使用三个文件表示一张表:

格式文件:存储表结构的定义(mytable.frm)
数据文件:存储表行的内容(mytable.MYD)
索引文件:存储表上索引(mytable.MYI)索引是为了帮助mysql高效获取数据的排好序的数据结构,缩小扫描范围。

对于一张表,只要是主键或者有unique约束的字段,会自动加索引。

MYISAM存储的特点,一个表对应的三个文件,都可以被压缩,节省空间,且当一个表只是读表时,可以转换成只读表来节省空间。

InnoDB

mysql默认的存储引擎,也是一个重量级的引擎

它支持事务,支持数据库崩溃后自动恢复机制,特点是安全。

它管理的表具有一下特征:

每个InnoDB表在数据库目录中以.frm格式文件表示
InnoDB表空间tablespace(一个逻辑名称)被用于存储表的内容(数据以及索引)
提供一组用来记录事务性活动的日志文件
用commit、savepoint、rollback支持事务处理
多版本的行级锁定
支持外键及引用的完整性,包括级联删除与更新。

以保证数据的安全,效率不是很高,并且文件不能压缩。

MyISAM与InnoDB

首先要知道,每个数据库的文件存储位置,是在磁盘文件上的。每一个数据库对应的是一个文件夹,表对应的是文件夹内的子文件,

在这里插入图片描述

在这里插入图片描述

如果存在索引的话,.MYD文件存储的是数据元素,MYI存储的是索引。

MyISAM叶子节点存储的是数据的磁盘地址

MyISAM不支持事务。

InnoDB

表数据文件本身就是一个B+tree组织的一个索引结构文件

innodb表叶子节点存储的是完整的数据记录

在这里插入图片描述

在这里插入图片描述

叶子节点之间,还有一个指针维护着相邻两个叶子节点的地址,也就是说在范围查询时,这个双向指针可以减少查询索引的次数。这样的查询是基于整个字段是有序的。

Hash

mysql并没有放弃hash结构,但是按照hash来排序的话,是不能很好支持范围查找的,它在判断是否相等这种条件查询是效率很高的。

B+TREE

使用自增主键建立索引,因为在写入新数据后,如果增加后的叶子节点长度达到最大长度后,叶子结点就会分裂成两个子节点,而b+树为了维护自己的有序性,会建立冗余索引,此时新建立的索引会影响之前的索引,从而导致树的平衡,影响效率。如果通过自增的方式添加元素,只会在最后一个节点处产生分裂,产生分裂的节点的最小值作为上一级冗余索引的节点,会直接添加到上一级的尾部,从而影响的范围比较小,树平衡的代价比较低,效率高!

联合索引&索引最左前缀原则

在这里插入图片描述

​ 当根据多个条件形成索引的时候,首先会根据第一个字段排序建立索引,如果不能根据第一个字段划分开来,就需要借助第二个字段,以此类推,建立起来的完整索引叫做联合索引。

索引最左前缀原则:当我们在查询时,如果直接跳过最左的字段,那么这条查询就不会走索引。因为当跳过最左前缀时,在索引中就找不到数据的位置。相当于我想找第14页第22行第7个字,这时我跳过了页数,说要找第22行和第7个字,这时查找的要求就不明确,无法根据索引查找。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值