参考文章内容:MySQL索引 - 黄文博 - 博客园
MySQL入门教程(MySQL tutorial book)

一、关于存储引擎

数据库存储引擎是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建、查询、更新和删除数据。
不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同的存储引擎,还可以获得特定的功能。

Oracle 和SQL Server等数据库中只有一种存储引擎。

MySQL数据库提供了多种存储引擎,被称为“Pluggable Storage Engine Architecture”(可替换存储引擎架构)的特性。

用户可以根据不同的需求为数据表选择不同的存储引擎,用户也可以根据自己的需要编写自己的存储引擎。

MySQL数据库在实际的工作中其实分为了语句分析层存储引擎层
其中语句分析层就主要负责与客户端完成连接并且事先分析出SQL语句的内容和功能。
存储引擎层则主要负责接收来自语句分析层的分析结果,完成相应的数据输入输出和文件操作。

存储引擎说白了就是如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方法。

因为在关系数据库中数据的存储是以表的形式存储的,所以存储引擎也可以称为表类型(即存储和操作此表的类型)。

1、存储引擎种类

存储引擎主要有: 1. MyIsam , 2. InnoDB, 3. Memory, 4. Archive, 5. Federated 。
MySQL的索引和存储引擎

2、MyISAM引擎

MyISAM是MySQL5.5版本以前默认的数据库引擎。
这种引擎是MySQL最早提供的。这种引擎又可以分为静态MyISAM、动态MyISAM 和压缩MyISAM三种:

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

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

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

当然不管是何种MyISAM表,目前它都不支持事务,行级锁和外键约束的功能,这就意味着有事务处理需求的表,不能使用MyISAM存储引擎。MyISAM存储引擎特别适合在以下几种情况下使用:

  • 选择密集型的表。MyISAM存储引擎在筛选大量数据时非常迅速,这是它最突出的优点。
  • 插入密集型的表。MyISAM的并发插入特性允许同时选择和插入数据。

MySQL的索引和存储引擎

3、InnoDB引擎

InnoDB是MySQL5.5版本以后默认的存储引擎。
InnoDB表类型可以看作是对MyISAM的进一步更新产品,它提供了事务、行级锁机制和外键约束的功能。
InnoDB的表需要更多的内存和存储,它会在主内存中建立其专用的缓冲池用于高速缓冲数据和索引。 使用InnoDB是最理想的选择:

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

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

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

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

  • 支持自动增加列AUTO_INCREMENT属性

4、MyISAM与InnoDB的总结

yISAM是MySQL5.5版之前的默认数据库引擎。虽然性能极佳,⽽且提供了⼤量的特性,包括全⽂索引、压缩、空间函数等,但MyISAM不⽀持事务和⾏级锁,⽽且最⼤的缺陷就是崩溃后⽆法安全恢复。不过,5.5版本之后,MySQL引⼊了InnoDB(事务性数据库引擎),MySQL 5.5版本后默认的存储引擎为InnoDB。

⼤多数时候我们使⽤的都是 InnoDB 存储引擎,但是在某些情况下使⽤ MyISAM 也是合适的⽐如读密集的情况下。(如果你不介意 MyISAM 崩溃恢复问题的话)。

两者的对⽐:

  1. 是否⽀持⾏级锁 : MyISAM 只有表级锁(table-level locking),⽽InnoDB ⽀持⾏级锁(row-level locking)和表级锁,默认为⾏级锁。

  2. 是否⽀持事务和崩溃后的安全恢复: MyISAM 强调的是性能,每次查询具有原⼦性,其执⾏速度⽐InnoDB类型更快,但是不提供事务⽀持。但是InnoDB 提供事务⽀持事务,外部键等⾼级数据库功能。 具有事务(commit)、回滚(rollback)和崩溃修复能⼒(crash recovery capabilities)的事务安全(transaction-safe (ACID compliant))型表。

  3. 是否⽀持外键: MyISAM不⽀持,⽽InnoDB⽀持。

  4. 是否⽀持MVCC :仅 InnoDB ⽀持。应对⾼并发事务, MVCC⽐单纯的加锁更⾼效;MVCC只在READ COMMITTED 和 REPEATABLE READ 两个隔离级别下⼯作;MVCC可以使⽤ 乐观(optimistic)锁 和 悲观(pessimistic)锁来实现;各数据库中MVCC实现并不统⼀。

可阅读:MySQL-InnoDB-MVCC多版本并发控制 - 编程空间 - SegmentFault 思否

5、其他存储引擎

MySQL的索引和存储引擎

二、关于索引

索引是加快我们查找数据的利器,MySQL中的索引有很多种类型,它们是在存储引擎层实现的,这意味着不同的存储引擎支持的索引类型可能不同,即使相同,底层工作原理也可能不同。

MySQL索引使⽤的数据结构主要有BTree索引哈希索引
对于哈希索引来说,底层的数据结构就是哈希表,因此在绝⼤多数需求为单条记录查询的时候,可以选择哈希索引,查询性能最快;其余⼤部分场景,建议选择BTree索引
MySQL的索引和存储引擎
MySQL的BTree索引使⽤的是B树中的B+Tree。

MyISAM: B+Tree叶节点的data域存放的是数据记录的地址。
在索引检索的时候,⾸先按照B+Tree搜索算法搜索索引,如果指定的Key存在,则取出其 data 域的值,然后以 data 域的值为地址读取相应的数据记录。这被称为“⾮聚簇索引”。

InnoDB: 其数据⽂件本身就是索引⽂件。
相⽐MyISAM,索引⽂件和数据⽂件是分离的,其表数据⽂件本身就是按B+Tree组织的⼀个索引结构,树的叶节点data域保存了完整的数据记录。
这个索引的key是数据表的主键,因此InnoDB表数据⽂件本身就是主索引。这被称为“聚簇索引(或聚集索引)”。
⽽其余的索引都作为辅助索引,辅助索引的data域存储相应记录主键的值⽽不是地址,这也是和MyISAM不同的地⽅。
在根据主索引搜索时,直接找到key所在的节点即可取出数据;在根据辅助索引查找时,则需要先取出主键的值,再⾛⼀遍主索引。
因此,在设计表的时候,不建议使⽤过⻓的字段作为主键,也不建议使⽤⾮单调的字段作为主键,这样会造成主索引频繁分裂。

B+树的特性:

1、B+树将所有的查找结果放在叶子节点中,这也就意味着查找B+树,就必须到叶子节点才能返回结果;

2、B+树每一个节点的关键字个数和子树指针个数相同;

3、B+树的非叶子节点的每一个关键字对应一个指针,而关键字则是子树的最大,或者最小值;

相关文章: