zoukankan      html  css  js  c++  java
  • MYSQL 第五章 存储引擎

    MySQL 5.7 支持的存储引擎有 InnoDB、MyISAM、Memory、Merge、Archive、Federated、CSV、BLACKHOLE 等。可以使用SHOW ENGINES;语句查看系统所支持的引擎类型,结果如图所示。

    MySQL数据库中的存储引擎


    Support 列的值表示某种引擎是否能使用,YES表示可以使用,NO表示不能使用,DEFAULT表示该引擎为当前默认的存储引擎。

    下面简要描写几种存储引擎,后面会对其中的几种(主要是 InnoDB 和 MyISAM )进行详细讲解。像 NDB 这样的需要更多扩展性的讨论,这超出了本教程的介绍范畴,所以在教程后面对它们不会介绍太多。

    表 1 MySQL 的存储引擎
    存储引擎描述
    ARCHIVE 用于数据存档的引擎,数据被插入后就不能在修改了,且不支持索引。
    CSV 在存储数据时,会以逗号作为数据项之间的分隔符。
    BLACKHOLE 会丢弃写操作,该操作会返回空内容。
    FEDERATED 将数据存储在远程数据库中,用来访问远程表的存储引擎。
    InnoDB 具备外键支持功能的事务处理引擎
    MEMORY 置于内存的表
    MERGE 用来管理由多个 MyISAM 表构成的表集合
    MyISAM 主要的非事务处理存储引擎
    NDB MySQL 集群专用存储引擎


    有几种存储引擎的名字还有同义词,例如,MRG_MyISAM 和 NDBCLUSTER 分别是 MERGE 和 NDB 的同义词。存储引擎 MEMORY 和 InnoDB 在早期分别称为 HEAP 和 Innobase。虽然后面两个名字仍能被识别,但是已经被废弃了。

    1.查看默认使用的引擎

    mysql> show variables like 'default_storage_engine%';
    +------------------------+--------+
    | Variable_name          | Value  |
    +------------------------+--------+
    | default_storage_engine | InnoDB |
    +------------------------+--------+
    1 row in set (0.00 sec)
    
    mysql> 

    修改默认的搜索引擎

    mysql> SET default_storage_engine=MyISAM;
    Query OK, 0 rows affected (0.00 sec)

    在使用 MySQL 数据库管理系统时,选择一个合适的存储引擎是一个非常复杂的问题。不同的存储引擎都有各自的特性、优势和使用的场合,正确的选择存储引擎可以提高应用的使用效率。
     
    为了能够正确地选择存储引擎,必须掌握各种存储引擎的特性。下面重点介绍几种常用的存储引擎,它们对各种特性的支持如下表所示。

    MySQL存储引擎特性汇总和对比
    特性MyISAMInnoDBMEMORY
    存储限制 支持
    事务安全 不支持 支持 不支持
    锁机制 表锁 行锁 表锁
    B树索引 支持 支持 支持
    哈希索引 不支持 不支持 支持
    全文索引 支持 不支持 不支持
    集群索引 不支持 支持 不支持
    数据缓存   支持 支持
    索引缓存 支持 支持 支持
    数据可压缩 支持 不支持 不支持
    空间使用 N/A
    内存使用 中等
    批量插入速度
    支持外键 不支持 支持 不支持

     
    表中主要介绍了 MyISAM、InnoDB 和 MEMORY 三种存储引擎特性的对比。下面详细介绍这 3 个存储引擎的应用场合并给出相应的建议。

    1) MyISAM

    在 MySQL 5.1 版本及之前的版本,MyISAM 是默认的存储引擎。
     
    MyISAM 存储引擎不支持事务和外键,所以访问速度比较快。如果应用主要以读取和写入为主,只有少量的更新和删除操作,并且对事务的完整性、并发性要求不是很高,那么选择 MyISAM 存储引擎是非常适合的。
     
    MyISAM 是在 Web 数据仓储和其他应用环境下最常使用的存储引擎之一。

    2) InnoDB

    MySQL 5.5 版本之后默认的事务型引擎修改为 InnoDB。
     
    InnoDB 存储引擎在事务上具有优势,即支持具有提交、回滚和崩溃恢复能力的事务安装,所以比 MyISAM 存储引擎占用更多的磁盘空间。

    如果应用对事务的完整性有比较高的要求,在并发条件下要求数据的一致性,数据操作除了插入和查询以外,还包括很多的更新、删除操作,那么 InnoDB 存储引擎是比较合适的选择。
     
    InnoDB 存储引擎除了可以有效地降低由于删除和更新导致的锁定,还可以确保事务的完整提交(Commit)和回滚(Rollback),对于类似计费系统或者财务系统等对数据准确性要求比较高的系统,InnoDB 都是合适的选择。

    3) MEMORY

    MEMORY 存储引擎将所有数据保存在 RAM 中,所以该存储引擎的数据访问速度快,但是安全上没有保障。
     
    MEMORY 对表的大小有限制,太大的表无法缓存在内存中。由于使用 MEMORY 存储引擎没有安全保障,所以要确保数据库异常终止后表中的数据可以恢复。
     
    如果应用中涉及数据比较少,且需要进行快速访问,则适合使用 MEMORY 存储引擎。

    总结

    不同应用的特点是千差万别的,选择适应存储引擎才是最佳方案也不是绝对的,这需要根据实际应用进行测试,从而得到最适合的结果。

    查看表的引擎

    mysql> show create table  dept_emp;
    +----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | Table    | Create Table                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
    +----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | dept_emp | CREATE TABLE `dept_emp` (
      `emp_no` int(11) NOT NULL,
      `dept_no` char(4) NOT NULL,
      `from_date` date NOT NULL,
      `to_date` date NOT NULL,
      PRIMARY KEY (`emp_no`,`dept_no`),
      KEY `dept_no` (`dept_no`),
      CONSTRAINT `dept_emp_ibfk_1` FOREIGN KEY (`emp_no`) REFERENCES `employees` (`emp_no`) ON DELETE CASCADE,
      CONSTRAINT `dept_emp_ibfk_2` FOREIGN KEY (`dept_no`) REFERENCES `departments` (`dept_no`) ON DELETE CASCADE
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
    +----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    1 row in set (0.00 sec)
    
    mysql> 

    修改表的引擎

    mysql> alter table dept_emp engine=MyISAM;
  • 相关阅读:
    雷林鹏分享:Lua if 嵌套语句
    雷林鹏分享:Lua if...else 语句
    雷林鹏分享:Lua if 语句
    debug 使用lldb
    mysql高负载的问题排查
    一个NULL引发的血案
    画椭圆型
    异常分析
    go 语言的库文件放在哪里?如何通过nginx代理后还能正确获取远程地址
    defer 要放在return之前
  • 原文地址:https://www.cnblogs.com/zy09/p/13037960.html
Copyright © 2011-2022 走看看