《MySQL实战45讲》
表结构和表数据文件:https://www.cnblogs.com/meitian/p/9886654.html、https://blog.csdn.net/lhanson/article/details/82803947
InnoDB架构:https://blog.csdn.net/qqqq0199181/article/details/80659856
Myisam和InnoDB:https://cloud.tencent.com/developer/article/1418038
1 什么时候使用Memory引擎
InnoDB和Memory引擎的数据组织方式是不同的:
InnoDB引擎把数据放在主键索引上,其他索引上保存的是主键id,称之为索引组织表(Index OrganiziedTable)。
Memory引擎采用的是把数据单独存放,索引上保存数据位置的数据组织形式,称之为堆组织表(Heap OrganiziedTable);
比如有id主键和一个字段,依次写入1,2,3,4,5,6,7,8,9,0主键和对应的值
可以看出这两个引擎的⼀些典型不同:
- InnoDB表的数据是有序存放的;
内存表的数据是按照写入顺序存放的; - 当数据文件有空洞的时候,InnoDB表在插⼊新数据的时候,为了保证数据有序性,只能在固定的位置写⼊新值;
内存表找到空位就可以插入新值; - 数据位置发生变化的时候,InnoDB表只需要修改主键索引;
内存表需要修改所有索引; - InnoDB表用主键索引查询时需要走⼀次索引查找,用普通索引查询的时候,需要走两次索引查找;
内存表没有这个区别,所有索引的“地位”都是相同的。 - InnoDB⽀持变长数据类型,不同记录的长度可能不同;
内存表不⽀持Blob 和 Text字段,并且即使定义了varchar(N),实际也当作char(N),也就是固定长度字符串来存储,因此内存表的每行数据长度相同。
Memory支持哈希索引和B-Tree索引,可以同时使用:
内存表的优势是速度快,原因:
Memory引擎支持hash索引;
内存表的所有数据都保存在内存,读写速度比磁盘表快。
不建议在生产环境上使用内存表:
- 1.锁粒度问题
内存表不支持行锁,只支持表锁。
- 2.数据持久化问题
数据放在内存中,是内存表的优势,但也是⼀个劣势,因为数据库重启的时候,所有的内存表都会被清空。
如图双M架构:
假如slave重启,由于MySQL知道重启之后,内存表的数据会丢失,所以,担心备库重启之后,出现主备不⼀致,MySQL在实现上做了这样⼀件事:在数据库重启之后,往binlog里面写⼊⼀行DELETE FROM 表名
;
在备库重启的时候,备库binlog里的delete语句就会传到主库,然后把主库内存表的内容删除,这样在使用的时候就会发现,主库的内存表数据突然被清空了。
使用Memor的场景:在数据量可控,不会耗费过多内存的情况下,可以考虑使用内存表,如将InnoDB临时表改为使用内存表
内存临时表刚好可以无视内存表的两个不足,原因:
- 临时表不会被其他线程访问,没有并发性的性能问题;
- 临时表重启后也是需要删除的,清空数据这个问题不存在;
- 备库的临时表也不会影响主库的用户线程。
而相比临时表的好处则为:
- 相比于InnoDB表,使用内存表不需要写磁盘,往临时表的写数据的速度更快;
- 索引使用hash索引,查找的速度比B+Tree索引快,且如果需要按范围查找,则可以加上B-Tree索引
- 临时表数据不多,占用的内存有限。
2 MySQL的内容
可结合序号为1的文章阅读
2.1 物理结构
通过文件系统对数据和索引进行存储
从物理结构上可以分为日志文件和数据索引文件。
在Linux中的数据索引文件和日志文件都在/var/lib/mysql目录下。
日志文件采用顺序IO方式存储、数据文件采用随机IO方式存储。
2.2 日志
错误日志(errorlog)
二进制日志(bin log)
通用查询日志(general query log)
慢查询日志(slow query log)
重做日志(redo log)
回滚日志(undo log)
中继日志(relay log)
2.3 文件
一个database对应一个目录
- InnoDB数据文件
.frm文件:主要存放与表相关的数据信息,主要包括表结构的定义信息
.ibd:使用独享表空间存储表数据和索引信息,一张表对应一个ibd文件。
.ibdata文件:使用共享表空间存储表数据和索引信息,所有表共同使用一个或者多个ibdata文
件。
- MyIsam数据文件
.frm文件:主要存放与表相关的数据信息,主要包括表结构的定义信息
.myd文件:主要用来存储表数据信息。
.myi文件:主要用来存储表数据文件中任何索引的数据树。
InnoDB数据和索引在同一个文件,MyIsam则分开存储
也因此MyIsam为非聚集索引,InnoDB为聚集索引
2.4 区别
https://cloud.tencent.com/developer/article/1418038:
3 InnoDB架构
由内存池、后台线程、磁盘文件三大部分组成
Dubbo write:刷新脏页到磁盘时,写两份,避免数据丢失,达到数据页的高可靠性
https://blog.csdn.net/qqqq0199181/article/details/80659856