前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >搞定PHP面试 - MySQL基础知识点整理 - 存储引擎

搞定PHP面试 - MySQL基础知识点整理 - 存储引擎

作者头像
猿哥
发布2019-07-01 16:09:48
5110
发布2019-07-01 16:09:48
举报
文章被收录于专栏:Web技术布道师Web技术布道师

MySQL基础知识点整理 - 存储引擎

0. 查看 MySQL 支持的存储引擎

可以在 mysql 客户端中,使用 show engines; 命令可以查看MySQL支持的引擎:

代码语言:javascript
复制
mysql> show engines;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine             | Support | Comment                                                        | Transactions | XA   | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| InnoDB             | DEFAULT | Supports transactions, row-level locking, and foreign keys     | YES          | YES  | YES        |
| MRG_MYISAM         | YES     | Collection of identical MyISAM tables                          | NO           | NO   | NO         |
| MEMORY             | YES     | Hash based, stored in memory, useful for temporary tables      | NO           | NO   | NO         |
| BLACKHOLE          | YES     | /dev/null storage engine (anything you write to it disappears) | NO           | NO   | NO         |
| MyISAM             | YES     | MyISAM storage engine                                          | NO           | NO   | NO         |
| CSV                | YES     | CSV storage engine                                             | NO           | NO   | NO         |
| ARCHIVE            | YES     | Archive storage engine                                         | NO           | NO   | NO         |
| PERFORMANCE_SCHEMA | YES     | Performance Schema                                             | NO           | NO   | NO         |
| FEDERATED          | NO      | Federated MySQL storage engine                                 | NULL         | NULL | NULL       |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
9 rows in set (0.06 sec)

1. InnoDB 引擎

InnoDB 是 MySQL 默认的存储引擎,也是最重要、使用最广泛的存储引擎。

InnoDB 的性能和自动崩溃恢复特性,使得它在非事务型存储的需求中也很流行。

除非有非常特别的原因需要使用其他的存储引擎,否则应该优先考虑 InnoDB 引擎。

InnoDB 的特性
代码语言:javascript
复制
select count(*) from table
InnoDB 存储表和索引有两种方式

使用共享表空间存储:表结构保存在 .frm 文件中,数据和索引在 innodb_data_home_dirinnodb_data_file_path 定义的表空间中,可以是多个文件。

使用多表空间存储:表结构保存在 .frm 文件中,每个表的数据和索引单独保存在 .ibd 中。

InnoDB 的使用场景

更新密集的表:InnoDB存储引擎特别适合处理多重并发的更新请求。

事务:InnoDB存储引擎是支持事务的标准MySQL存储引擎。

自动灾难恢复:InnoDB表能够自动从灾难中恢复。

外键约束:MySQL支持外键的存储引擎只有InnoDB。

支持自动增加列 AUTO_INCREMENT 属性。

2. MyISAM 引擎

MyISAM 是 MySQL 5.1 及之前版本的默认存储引擎。MySQL 8 即将废弃 MyISAM 引擎。

MyISAM 提供了全文索引、压缩、空间函数(GIS)等特性。

MyISAM 不支持事务和行级锁,崩溃后无法安全恢复。

MyISAM 的特性
代码语言:javascript
复制
select count(*) from table
MyISAM 的三种存储格式

MyISAM 的三种存储格式分别为静态、动态和压缩。MyISAM 会根据表的定义自动选择存储格式。

静态表:如果数据表中的各数据列的长度都是预先固定好的,服务器将自动选择这种表类型。因为数据表中每一条记录所占用的空间都是一样的,所以这种表存取和更新的效率非常高。当数据受损时,恢复工作也比较容易做。

动态表:如果数据表中出现 varchar*text*BLOB 字段时,服务器将自动选择这种表类型。相对于静态MyISAM,这种表存储空间比较小,但由于每条记录的长度不一,所以多次修改数据后,数据表中的数据就可能离散的存储在内存中,进而导致执行效率下降。同时,内存中也可能会出现很多碎片。因此,这种类型的表要经常用 optimize table 命令或优化工具来进行碎片整理。

压缩表:以上说到的两种类型的表都可以用myisamchk工具压缩。如果表在创建并导入数据后,不在进行修改操作,这样的表适合采用 MyISAM 压缩表。这种类型的表进一步减小了占用的存储,但是这种表压缩之后不能再被修改。另外,因为是压缩数据,所以这种表在读取的时候要先时行解压缩。

MyISAM 表存储

每个 MyISAM 表在磁盘上存储成三个文件,每一个文件的名字均以表的名字开始,扩展名指出文件类型。

.frm 文件存储表结构定义。

.MYD (MYData) 文件存储表的数据。

.MYI (MYIndex) 文件存储表的索引。

MyISAM 使用场景

查询密集型表:MyISAM 存储引擎在筛选大量数据时非常快,是它最突出的优点;

插入密集型表:MyISAM 的并发插入特性允许同时选择、插入数据。例如:MyISAM存储引擎非常适合管理邮件或Web服务器日志数据。

3. MEMORY 引擎

MEMORY 引擎(也叫 HEAP 引擎),将所有数据都保存在内存中,不需要进行磁盘I/O。因此,MEMORY表至少比 MyISAM 表快一个数量级。

MySQL 重启或 mysqld 守护进程崩溃时,Memory 表的结构还会保留,但是所有的数据都会丢失。

获得速度的同时也带来一些缺陷。它要求存储在Memory数据表里的数据用的是长度不变的格式,这意味着不能用BLOB和TEXT这样的长度可变的数据类型,VARCHAR是种长度可变的类型,但因为它在MySQL内部当做长度固定不变的CHAR类型,所以可以使用。

MEMORY 的特性
  • 数据都保存在内存中,不需要进行磁盘I/O。
  • 支持 Hash 索引和B树索引。
  • 支持表级锁,不支持行级锁。
  • 服务重启后,表结构还会保留,但是数据会丢失。
  • 不支持 TEXT 和 BLOB 类型的列。
MEMORY 使用场景
  • 需要快速地访问数据,并且这些数据不会被修改,重启以后丢失也没有关系。
  • 用于查找(lookup)或者映射(mapping)表,例如将邮编和地址映射的表。
  • 用于保存数据分析中产生的中间数据。
  • 用于缓存周期性聚合数据的结果。

4. ARCHIVE 引擎

ARCHIVE 引擎是一个针对插入和压缩做了优化的简单存储引擎。

ARCHIVE 引擎只支持 INSERT 和 SELECT 操作。MySQL 5.1 之前也不支持索引。

ARCHIVE 引擎会利用 zlib 对插入的行进行压缩,所以比 MyISAM 表的磁盘 I/O 更少。

ARCHIVE 的特性
  • 只支持 INSERT 和 SELECT 操作。
  • MySQL 5.1 之前不支持索引。
  • 支持行级锁和专用缓冲区。
ARCHIVE 使用场景
  • 适合日志和数据采集类应用,这类应用做数据分析时往往需要全表扫描。
  • 需要快速 INSERT 操作的场景。

5. MERGE 引擎

MERGE 存储引擎是 MyISAM 引擎的变种。MERGE 表是由多个 MyISAM 表合并而来的虚拟表,这些MyISAM表结构必须完全相同。Merge表中并没有数据,对Merge类型的表可以进行查询、更新、删除操作,这些操作实际上是对内部的MyISAM表进行操作。

Merge存储引擎使用场景对于服务器日志这种信息,一般常用的存储策略是将数据分成很多表,每个名称与特定时间端相关。例如:可以用12个相同的表来存储服务器的日志数据,每个表用对应各个月份的名字来命名。当有必要基于所有12个日志表的数据来生成报表时,这意味着需要编写、更新多表查询,以反映这些表中的信息。与其编写这些可能会出现错误的查询,不如将这些表合并起来使用一条查询,之后再删除Merge表而不影响原来的数据,删除Merge表只会删除掉Merge表的定义,对内部表没有任何影响。

但是引入分区功能后,该引擎已经被放弃。

6. CSV 引擎

CSV 引擎可以将普通的 CSV 文件作为 MySQL 的表来处理,但是这种表不支持索引。

CSV 的特点
  • 可以将普通的 CSV 文件作为 MySQL 的表来处理。
  • 所有的列必须都是不能为NULL的
  • 不支持索引(不适合大表,不适合在线处理)
  • 可以对数据文件直接编辑(保存文本文件内容)
CSV 使用场景
  • 适合做为数据交换的中间表(能够在服务器运行的时候,拷贝和拷出文件,可以将电子表格存储为CSV文件再拷贝到MySQL数据目录下,就能够在数据库中打开和使用。同样,如果将数据写入到CSV文件数据表中,其它web程序也可以迅速读取到数据。

原文:https://segmentfault.com/a/1190000019550142

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-06-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 PHP技术大全 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • MySQL基础知识点整理 - 存储引擎
    • 0. 查看 MySQL 支持的存储引擎
      • 1. InnoDB 引擎
        • InnoDB 的特性
        • InnoDB 存储表和索引有两种方式
        • InnoDB 的使用场景
      • 2. MyISAM 引擎
        • MyISAM 的特性
        • MyISAM 的三种存储格式
        • MyISAM 表存储
        • MyISAM 使用场景
      • 3. MEMORY 引擎
        • MEMORY 的特性
        • MEMORY 使用场景
      • 4. ARCHIVE 引擎
        • ARCHIVE 的特性
        • ARCHIVE 使用场景
      • 5. MERGE 引擎
        • 6. CSV 引擎
          • CSV 的特点
          • CSV 使用场景
      相关产品与服务
      云数据库 SQL Server
      腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档