11MySQL存储引擎
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了11MySQL存储引擎相关的知识,希望对你有一定的参考价值。
mysql存储引擎介绍
MySQL支持多种存储引擎,每种存储引擎有不同的特性和适用场景,下面简单介绍一下MySQL的几种常见存储引擎:
InnoDB:是MySQL的默认存储引擎,支持事务处理、行级锁、外键等高级特性,适合于处理大量的数据、高并发的读写操作。
MyISAM:不支持事务处理和行级锁,但是对于插入、查询等基本操作,速度较快。适合于读写比例低、对性能要求较高的场景。
MEMORY:将表的数据存储在内存中,速度非常快,但是数据无法持久化,适合于缓存表、临时表等。
CSV:将数据存储在CSV格式的文件中,适合于导入导出数据等。
NDB Cluster:是MySQL集群环境下的存储引擎,提供了高可用、高性能、高并发的特性,适合于分布式环境下的MySQL应用。
ARCHIVE :存储引擎适合于需要长期存储大量历史数据的应用场景,它采用数据压缩算法来减小存储空间,但不支持索引、查询和更新等操作。
BLACKHOLE: 存储引擎将写入的数据完全丢弃,只会记录二进制日志,适用于在主库中放置一个从库的情况,可以实现主从数据同步。
官方站点对各存储引擎介绍:https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/storage-engines.html
MVCC
MVCC是MySQL中实现事务隔离的一种机制,全称为“Multi-Version Concurrency Control”,即多版本并发控制。它可以在不加锁的情况下,实现对数据的并发访问和修改,保证了数据的一致性和隔离性。
在MVCC中,每个事务在执行过程中都有一个唯一的“版本号”,表示事务开始的时间点。MySQL中InnoDB存储引擎使用了MVCC机制,它将每行数据都保存在一个版本链中,不同的事务可以看到不同的版本数据。当多个事务同时对同一数据进行操作时,它们会在自己的版本链中创建一个新的版本,而不是直接修改数据,从而避免了数据的冲突。
MVCC有三种常见的实现方式:
1.版本号:在每个数据行上维护一个版本号,表示最近更新的事务的版本号,当查询一个数据时,事务只能查看版本号小于等于自己的数据行。MySQL中InnoDB存储引擎使用这种方式。
2.时间戳:给每个事务分配一个时间戳,通过时间戳来判断事务的可见性。
3.保存所有历史版本:保存所有历史版本的数据,由事务根据自己的版本选择合适的数据。
MVCC机制的优点是可以提高并发性和性能,减少锁的争用和等待时间。但是也会带来一些问题,比如数据一致性的问题,由于版本链的存在,可能会导致数据丢失或不一致。因此,在使用MVCC时,需要注意一些细节,如对于不同的事务隔离级别采用不同的实现方式,合理配置参数等。
如下例子
假设有一个名为employees的表格,包含以下字段:
现在有两个会话(Session A和Session B)同时对该表进行操作,执行如下操作:
Session A执行以下语句:UPDATE employees SET salary = 5000 WHERE id = 1
Session B执行以下语句:SELECT * FROM employees WHERE id = 1
这时候,MySQL中的MVCC机制就会发挥作用:
当Session A执行UPDATE语句时,MySQL会在内部创建一个新的版本(version)来保存这次修改。同时,在该记录上会保存一个指针,指向这个新版本。
当Session B执行SELECT语句时,MySQL会首先检查该记录是否已经被锁定。如果没有被锁定,则MySQL会查询当前的版本,并返回相应的结果。如果记录已经被锁定,则Session B将被阻塞,直到Session A释放该记录的锁。
当Session A执行COMMIT语句时,MySQL会将这个新版本标记为“已提交(committed)”,并释放该记录上的锁。此时,Session B就可以继续执行SELECT语句了。
在该表格中,可以看到Session A的UPDATE语句创建了一个新的版本,同时锁定了该记录。因此,Session B的SELECT语句只能查询到旧版本,即版本0。当Session A提交事务后,该版本就被标记为已提交,同时释放了该记录上的锁。此时,Session B就可以查询到新版本,即版本1,并返回相应的结果。
MYISAM存储引擎
MyISAM是MySQL中最常见的存储引擎之一,其主要特点是简单、快速和高效。下面是MyISAM存储引擎的一些特点:
适用场景:适用于读写比例低、查询为主的应用,比如数据仓库、日志系统等。由于其支持全文索引,也适用于需要全文检索的场景。同时,MyISAM不支持事务,因此对于强事务一致性的应用不适用,比如电商系统等。
InnoDB存储引擎
InnoDB是MySQL数据库的一种存储引擎,它是MySQL5.5版本之后的默认存储引擎,也是目前应用最广泛的存储引擎之一。相比于MyISAM引擎,InnoDB支持事务、行级锁定等高级功能,适用于需要高并发、高可靠性、高可用性的应用场景。
innodb数据文件
InnoDB 存储引擎在 MySQL 中使用独立的文件存储表数据和索引,这些文件的默认存储位置是 MySQL 的数据目录。InnoDB 存储引擎的文件包括:
注:innodb_file_per_table 是 InnoDB 存储引擎的一个参数,它表示是否为每个 InnoDB 数据库表单独创建一个表空间文件。当 innodb_file_per_table=ON 时,InnoDB 存储引擎会为每个 InnoDB 数据库表创建一个 .ibd 文件,所有表数据和索引都会保存在该文件中。当 innodb_file_per_table=OFF 时,所有的表数据和索引都保存在系统表空间文件 ibdata1 中;mysql5.5之后版本默认开启
ibdata1:系统表空间文件,存储 InnoDB 存储引擎的内部数据结构和元数据,如数据字典、插入缓冲区等。在创建第一个 InnoDB 表时自动创建,大小可以在配置文件中指定。
ib_logfile0 和 ib_logfile1:事务日志文件,记录 InnoDB 存储引擎的所有数据修改操作。在启动 InnoDB 存储引擎时自动创建,大小和数量可以在配置文件中指定。
表空间文件:每个 InnoDB 表都有一个对应的 .ibd 文件,存储表数据和索引。
除此之外,InnoDB 存储引擎还可以通过配置文件将表空间文件存储在不同的文件系统或磁盘上,以便实现更好的性能和可扩展性。
管理存储引擎
查看存储引擎
#查看支持的引擎
show engines;
#查看默认当前的使用的引擎
show variables like %storage_engine%;
设置默认的存储引擎
vim /etc/my.cnf
[mysqld]
default_storage_engine= InnoDB
查看库中所有表使用的存储引擎
show table status from db_name;
设置表的存储引擎:
CREATE TABLE tb_name(... ) ENGINE=InnoDB;
ALTER TABLE tb_name ENGINE=InnoDB;
以上是关于11MySQL存储引擎的主要内容,如果未能解决你的问题,请参考以下文章