MySQL存储引擎、索引知识整理

存储引擎

MySQL5.5以后默认使用InnoDB存储引擎。其中InnoDB和BDB提供事务安全表,其他存储引擎都是非事务安全表。

若要修改默认引擎,可以修改配置文件中的default-storage-engine。可通过show variables like ‘default_ storage_ engine’查看当前数据库的默认引擎。

在创建表的时候通过engine=…或type=…来指定所要使用的引擎。

show table status from DBname来查看指定表的引擎。

主要存储引擎:MyISAM、InnoDB、MEMORY、MERGE

InnoDB

与传统的ISAM与MyISAM相比,InnoDB的最大特色是支持了ACID兼容的事务功能,但写的效率差一些,并且会占用更多的磁盘空间以保留数据和索引。

事务(Transaction)

事务是访问并可能更新数据库中各种数据项的一个程序执行单元。由事务开始和事务结束之间执行的全体操作组成。

事务属性–ACID

事务是恢复和并发控制的基本单位。

ACID特性:

  • 原子性(atomacity):整个事务中的所有操作,要么全部完成,要么全部不完成。

    事务在执行过程中发生错误,会被回滚到事务开始前的状态,就像这个事务从来没有执行过一样。

  • 一致性(consistency):不管在任何给定的时间并发事务有多少个,数据库都处于一致性状态(从一个一致性状态变到另一个一致性状态)。一致性与原子性密切相关。

    假如五个账户同时发生多个转账,无论并发多少个,总额不会变。

  • 隔离性(isolation):一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。

  • 持久性(durability):也称永久性(permanence),在事务完成后,该事务对数据库所做的更改便持久的保存在数据库中,并不会被回滚。

目前有两种方式实现ACID:

  • 第一种是WAL技术(Write ahead logging),日志式的方式。中心思想是对数据文件的修改(它们是表和索引的载体)必须只能发生在这些修改已经记录了日志之后,即在日志记录冲刷到永久存储器之后。

    这样就不需要在每次事务提交的时候都把数据页冲刷到磁盘,因为在出现崩溃的情况下,可以用日志来恢复数据库:任何尚未附加到数据页的记录,都将先从日志记录中重做(这叫向前滚动恢复-REDO),然后那些未提交的事务做的修改将被从数据页中删除(这叫向后滚动恢复-UNDO)

  • 第二种是Shadow paging,技术实现起来相对较简单,消除了写日志记录的开销回复的速度也快(不需要redo和undo)。缺点是事务提交时要输出多个块,使得提交的开销很大,而且以块为单位,很难应用到允许多个事务并发执行的情况。

InnoDB的特点及使用场合:

InnoDB特点

事务型数据库的首选引擎,提供了事务、行级锁机制和外键约束的功能。

InnoDB给MySQL提供了具有事务、回滚和崩溃修复能力、多版本并发控制的事务安全型表。

InnoDB中行级锁定适合非常小的空间。“数据行级锁定”的意思是指在事务操作的执行过程中锁定正在被处理的个别记录,不让其他用户访问。

InnoDB数据表的数据行级锁定实际发生在它们的索引上,而不是数据表自身上。

InnoDB在主内存中建立其专用的缓冲池用于高速缓冲数据和索引。InnoDB把数据和索引存放在表空间里,可能包含多个文件,这与其他的不一样。如在MyISAM中,表被存放在单独的文件中。InnoDB表的大小只受限于操作系统的文件大小,每个表可以使用各自独立的表空间。

InnoDB使用场合

一般来说,如果需要事务支持,并且有较高的并发读取频率,选择InnoDB

在以下场合,使用InnoDB是最理想的选择:

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

  • 事务。InnoDB存储引擎提供了具有提交、回滚和崩溃恢复能力的事务安全。

  • 自动灾难恢复。与其他存储引擎不同,InnoDB表能够自动从灾难中恢复。

  • 支持自动增加列AUTO_INCREMENT属性。

    对于InnoDB表,自动增加列必须是索引,如果是组合索引,也必须是组合索引的第一列。

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

    在创建外键的时候,附表必须有对应的索引,子表在创建外键的时候也会自动创建对应的索引。

    可以使用set foreign_key_checks=0;临时关闭外set foreign_key_checks=1打开约束。

MyISAM

MyISAM是MySQL5.0之前的默认数据库引擎。拥有较高的插入、查询速度,但不支持事务

MyISAM表示独立于操作系统的,可以轻松将其从Windows服务器移植到linux服务器;

在建立有一个MyISAM引擎的表时,就会在本地磁盘上建立3个文件,文件名就是表名。 扩展名分别为:

  • .frm(存储表定义);
  • .MYD(存储数据);
  • .MYI(存储索引)。

数据文件和索引文件可以放置在不同的目录,平均分配IO,获取更快的速度。

MyISAM的表支持3种不同的存储格式:静态(固定长度)表;动态表;压缩表。

MyISAM适用场合

  • 选择密集型的表。MyISAM存储引擎突出的优点是在筛选大量数据时非常迅速。
  • 插入密集型的表。MyISAM的并发插入特性允许通知选择和插入数据。例如:MyISAM存储引擎很适合管理邮件或Web服务器日志数据。

MEMORY

使用MEMORY存储引擎的出发点是速度。

采用的逻辑存储介质是系统内存,每个MEMORY表实际对应一个磁盘文件,格式是.frm

MEMORY的数据是放在内存中的,并且默认使用HASH索引。但一旦服务器关闭,表中的数据就会丢失,但表还会继续存在。

MEMORY数据表默认使用散列索引,进行“相等比较”快,但对“范围比较“的速度慢多了,也不适合用在order by子句中。

如果确实要使用<或>或between操作符,可以使用btree索引来加快速度。

要求存储在Memory数据表里的数据使用的是长度不变的格式

MEMORY适用场合:

  • 目标数据较小,而且被非常频繁地访问。
  • 如果数据是临时的,而且要求必须立即可用,那么就可以存放在内存表中。
  • 存储在Memory表中的数据如果突然丢失,不会对应用服务产生实质的负面影响。

MERGE

MERGE存储引擎是一组MyISAM表的组合,这些MyISAM表结构必须完全相同。常应用于日志和数据仓库。

索引

索引是存储表中一个特定列的值的数据结构。索引中除了存储特定列的值,还存储着指向表中相应行的指针,注意,并不存储其他列的值。指针是指一块内存区域,记录的是对硬盘上记录的相应行的数据的引用。

用于索引的数据结构

(1)B-Tree

B-Tree是最常用的用于索引的数据结构。因为时间复杂低,增、删、查都可以在对数时间内完成;且存储在B-Tree中的数据是有序的。数据库管理系统(RDBMS)通常决定索引该用哪些数据结构。但也可指定。

(2)哈希索引

哈希表用作索引的数据结构。如果使用哈希索引,对于比较字符串是否相等的查询能够极快的检索出值,因为在寻找值时哈希表效率极高。

哈希索引的工作方式是将列的值作为索引的键值(key),和键值相对应实际的值(value)是指向该表中相应行的指针。因为哈希表基本上可以看做是关联数组。在哈希索引中查询”Mike”这样的值,得到对应行在内存中的引用,明显比扫描全表获得值为”Mike”的行的方式快很多。

缺点:哈希表是无序的数据结构,只适合键值对,即相等的查询,如where name = ‘Mike’。

(3)R-Tree
使用R-Tree作为数据结构的索引通常用来为空间问题提供帮助。

索引功能

可以加快数据检索操作。基本原则是如果表中某列在查询过程中使用非常频繁,那就在该列上创建索引。

缺点:表越大,占用空间越大;性能损失,当在表中增、删、改行数据的时候,在索引中也会有相同的操作。

注意:建立在某列(或多列)索引需要保存该列最新的数据。

每修改数据记录,索引就必须刷新一次。为了弥补,许多SQL命令都有一个个DELAY_KEY_WRITE项,暂时制止索引的刷新,等到全部记录插入/修改完毕之后再刷新。

索引类别

索引分为聚簇索引和非聚簇索引。聚簇索引是按照数据存放的物理位置为顺序的,能提高多行检索的速度,而非聚簇索引对于单行的检索很快。

  • 唯一索引:不允许其中任何两行具有相同索引值的索引。

  • 主键索引:主键索引是唯一索引的特定类型。

  • 聚集索引:表中行的物理顺序与键值的逻辑(索引)顺序相同。一个表只能包含一个聚集索引。

主索引和唯一索引的唯一区别是:主索引在定义时使用的关键字是PRIMARY而不是UNIQUE。

参考资料: