mysql数据库含有多种存储引擎,比如MyISAM、InnoDB、MEMORY等多个存储引擎,下面我们对这些存储引擎进行学习和认识。
MyISAM
InnoDB引擎是一个具有提交、回滚和崩溃恢复的存储引擎,InnoDB引擎提供了多个select语句可以访问同一条数据的特性,这保证了多用户部署和性能的提高。InnoDB也是支持外键的,在sql查询中你可以将InnoDB表和mysql的其他表混合使用。
InnoDB引擎具有多种事务隔离级别和行级锁机制,这些事务隔离级别和行级锁机制保证了InnoDB引擎在高并发的操作下可以保证数据的准确性。事务隔离级别有:可重复读、读已提交、读未提交、串行化读。行级锁机制含有共享锁、独占锁、间隙锁、意图共享/独占锁。
InnoDB存储引擎是默认支持B+树索引的,InnoDB引擎中的数据页可以组成一个双向链表,数据页中的数据按照主键记录形成一个单向链表。通过主键查询数据时采用的是二分查找法。若不根据主键查询,则按照顺序查询,先查询到数据所在的页记录,然后在数据页中查询记录。
InnoDB引擎是支持主键列自动增长和自动灾难恢复。
InnoDB引擎下我们进行优化的方式可以针对具体问题具体优化。比如innodb_buffer_pool_size:此选项的作用是用来设置InnoDB引擎用来缓存它的数据和索引的内存缓冲区的大小。此值设置的越高,其访问表中数据访问磁盘I/O的次数越少。innodb_flush_log_at_trx_commit:当innodb_flush_log_at_trx_commit被 设置为0,日志缓冲每秒一次地被写到日志文件,并且对日志文件做到磁盘操作的刷新,但是在一个事务提交不做任何操作。当这个值为1(默认值)之时,在每个事务提交时,日志缓冲被写到日志文件,对日志文件做到磁盘操作的 刷新。当设置为2之时,在每个提交,日志缓冲被写到文件,但不对日志文件做到磁盘操作的刷新。尽管如此,在对日志文件的刷新在值为2的情况也每秒发生一次。我们必须注意到,因为进程安排问题,每秒一次的 刷新不是100%保证每秒都发生。
MEMORY引擎拥有较快的响应时间,其是把数据存储在系统内存中,但是存储在系统内存中也是有缺陷的,当mysqld守护进程崩溃时,所有的数据都会丢失。并且存储的数据必须是定长的数据格式,所以不能使用BLOB和TEXT长度可变的数据类型,VARCHAR类型在mysql内部当作长度固定不变的CHAR类型,所以可以使用。
使用MEMORY引擎场景:1.目标数据较小,并且被频繁使用。可以采用max_heap_table_size选项控制MEMORY表的大小。2.如果数据是立即可用并且是临时的,可以存放在内存表中。3.存储在MEMORY表中的数据如果丢失之后,不对应用服务产生影响。
MEMORY引擎是支持B树索引和散列索引的。并且B树索引是优于散列索引的。