MySQL是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的RDBMS (Relational Database Management System,关系数据库管理系统)应用软件之一。
mysql的innodb和myisam索引区别
InnoDB和MyISAM是MySQL中的两种存储引擎,它们在事务处理、锁定级别、索引结构以及全文索引等方面存在区别:
- 事务处理:InnoDB支持事务处理,能够进行提交和回滚操作,而MyISAM不支持事务处理。
- 锁定级别:InnoDB支持行级锁,提供更高的并发性能;MyISAM仅支持表级锁,可能在执行写操作时导致整张表被锁定。
- 索引结构:InnoDB使用聚簇索引,数据文件和主键索引绑定在一起,通过主键索引的查询效率较高;MyISAM使用非聚簇索引,数据文件与索引分开存储。
- 全文索引:MyISAM支持全文索引,对于全文搜索有较好的性能;InnoDB直到MySQL 5.6版本才开始支持全文索引。
- 外键约束:InnoDB支持外键约束,用于保证数据的完整性;MyISAM不支持外键。
- 计数操作:MyISAM保存了表的行数,对
SELECT COUNT(*)
操作较快;InnoDB没有保存这个信息,需要全表扫描来计算行数。 - 恢复能力:系统崩溃后,MyISAM表的恢复相对困难;InnoDB因其事务日志而具有更好的恢复能力。
- 内存使用:InnoDB采用缓冲池来缓存数据和索引,减少磁盘I/O;MyISAM对内存的使用不如InnoDB高效。
- 自动提交:对于InnoDB,每条SQL语句默认封装成事务并自动提交,可以通过显式地使用
BEGIN
和COMMIT
来控制事务;而MyISAM不涉及事务的自动提交问题。
综上所述,InnoDB适合处理并发高及需要事务支持的场景,而MyISAM适合读取密集型的应用且不需要事务支持的情况。在选择存储引擎时,应考虑应用的具体需求,比如是否需要事务支持、并发访问量、是否需要全文索引等因素。
InnoDB引擎的4大特性
InnoDB引擎作为MySQL的默认存储引擎,拥有以下四大特性:
- 支持事务处理:InnoDB引擎支持完整的ACID事务,允许用户进行可靠的提交和回滚操作。这是通过其MVCC(多版本并发控制)机制以及强大的恢复能力实现的,确保了在并发环境下数据一致性和完整性。
- 外键约束:InnoDB支持外键约束,这有助于保持数据库中数据的参照完整性。通过外键可以创建一个表与另一个表之间的链接,确保数据的相关性和准确性。
- MVCC(多版本并发控制):InnoDB通过MVCC实现了非锁定读,这意味着在读取数据时不会对其进行锁定,从而允许其他事务同时对数据进行写入。这种机制提高了数据库在高并发情况下的性能。
- 行级锁定:InnoDB提供了行级锁定功能,相比于MyISAM的表级锁,行级锁可以更精细地控制并发访问,减少锁冲突,提高并发性能,特别适合于在线事务处理(OLTP)类型的应用。
除了上述特性,InnoDB还具有一个高度优化的缓冲池来减少磁盘I/O操作,以及聚集索引来提高主键查询的效率。这些技术特性共同作用,使得InnoDB成为处理大数据量和需要高并发访问场景下的理想选择。
插入缓存的合并频率是多少?
- 辅助索引页被读取到缓冲池中。正常的select先检查Insert Buffer是否有该非聚集索引页存在,若有则合并插入。
- 辅助索引页没有可用空间。空间小于1/32页的大小,则会强制合并操作。
- Master Thread 每秒和每10秒的合并操作。
二次写空间组成?
内存中的doublewrite buffer,大小2M。
物理磁盘上共享表空间中连续的128个页,即2个区(extend),大小同样为2M。
对缓冲池的脏页进行刷新时,不是直接写磁盘,而是会通过memcpy()函数将脏页先复制到内存中的doublewrite buffer,之后通过doublewrite 再分两次,每次1M顺序地写入共享表空间的物理磁盘上,在这个过程中,因为 doublewrite页是连续的,因此这个过程是顺序写的,开销并不是很大。在完成doublewrite页的写入后,再将 doublewrite buffer 中的页写入各个表空间文件中,此时的写入则是离散的。如果操作系统在将页写入磁盘的过程 中发生了崩溃,在恢复过程中,innodb可以从共享表空间中的doublewrite中找到该页的一个副本,将其复制到表空 间文件,再应用重做日志。
自适应hash索引有什么坏处
- hash自适应索引会占用innodb buffer pool。
- 自适应hash索引只适合搜索等值的查询,如select * from table where index_col=‘xxx’,而对于其他查找类型, 如范围查找,是不能使用的。
- 极端情况下,自适应hash索引才有比较大的意义,可以降低逻辑读。