mysql之InnoDB存储引擎剖析

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yonggeit/article/details/82181567

Mysql技术内幕

查看配置文件生效顺序

查看配置文件生效顺序(如果多个配置文件中有同一个人参数,会读取到最后一个配置文件)

mysql --help|grep my.cnf

mysql存储引擎

  1. MYSQL5.5.8开始,innnodb作为默认的存储引擎,对于MyISAM存储引擎,Mysql只缓存其索引文件,数据文件的缓存由操作系统完成,这与其他使用LRU算法的大部分数据库大不相同,此外,在Mysql5.1.23版本之前,无论32位还是64操作系统,缓存索引的缓冲区最大只能设置为4GB,在之后的版本中,64位系统可以支持大于4G的缓冲区;
  2. Memory存储引擎将数据放在内存中,重启或崩溃数据会丢失,默认用HASH索引,只支持表锁,并发性能比较差,并且不支持TEXT和BLOB数据类型,存储VARCHAR按照CHAR方式进行,比较浪费内存,如果使用MEMORY作为临时表来存放查询结果集,如果结果集大于MEMORY存储引擎表的设置,或是含有text或blob类型的字段,会自动转为MySIAM,MYSIM不缓存数据文件,将数据文件存储在磁盘,这对临时表的性能是有损失的
  3. Archive存储引擎只支持select和insert,从5.1开始支持索引,其采用zlib算法将数据行压缩后存储,压缩比可达到1:10,适合存储日志信息,使用行锁来实现并发插入,但本身不是事物安全的存储引擎,其目标是高速插入和压缩功能.
  4. dedarated存储引擎,不存放数据,只指向远程mysql服务器的表.
  5. Maria存储引擎是Mysql创始人之一蒙蒂新开发的,用于取代mysiam作为默认存储引擎,特点是支持缓存数据和索引文件,引用行锁所设计,提供了MVCC功能,支持事物和非事物的安全选项,以及=更好的BLOB字符类型的存储能力
  6. image

mysql连接方式

  1. tcp/ip
  2. unix套接字,套接字不是一个网络协议,只能客服端和mysql实例在同一个服务器上,可以在配置文件中指定套接字的路径,如–socket=/tmp/mysql.socket
  3. 命名管道和共享内存,两个通信的进程在同一个服务器上,可以使用命名管道,需要在配置文件启用–enable-named-pipe,4.1以后提供了共享内存的连接方式,配置文件中添加–shared-memory,客户端需使用–protocal=memory;

innodb体系结构:

innodb存储引擎版本

从5.1开始允许使用动态方式加载引擎,存储引擎不再受mysql版本控制

 innodb架构

innodb有多个内存块组成一个大内存池,负责线程,进程访问的多个内部结构;缓存磁盘上的数据,方便快速读取,同时在磁盘文件修改前做缓存;redo log缓冲,后台线程主要是负责刷新内存池中的数据,保证缓冲池内缓冲的是最近的数据,,此外将已修改的数据文件刷新到磁盘,通时保证数据库发生异常时inndb能恢复到正常运行状态;

后台线程

Master Thread

主要负责将缓冲池中的数据异步刷新到磁盘,保证数据的一致性包括脏页的刷新,合并插入缓冲,undo页的回收等

IO Thread

innodb中使用了大量的AIO(Async IO),来处理写IO请求,这样可以极大的提高数据库的性能,IIO Thread 主要负责这些IO请求的回调处理,Innodb1.0版本之前共有4个IO Thread,分别是write,read,insert,buffer,和log IO Thread,Linux下Io Thread的数量是不能调整的,innodb_file_io_threads来增加IO
thread,从innoDB1.0.x开始,read thread和write thread分别使用innodb_read_io_threads和innodb_write_threads设置.

show VARIABLES LIKE 'innodb_version'\G;
show VARIABLES LIKE 'innodb_%io_threads'

show engine innodb status;

可见读线程的id总是小于写线程

Purge Thread

事物提交后,其所使用的undo log 不再需要,已经使用并分配的undo页,在InnoDB1.1版本之前,purge操作仅在Master Thread中完成,InnoDB1.1版本开始,purge操作可独立到单独的线程中进行,从而减轻Master Thread的工作,从而提高cpu的使用率以及提升存储引擎的性能,可通过如下配置启用独立的Purge Thread:

[mysqld]
innodb_purge_thread=1
设置大于1的值无效,会抛出warning

从InnoDB1.2开始,Innodb为了进一步加快undo 页的回收支持多个Purge Thread ,,同时由于Purge Thread需要离散的读取undo页,这样也能进一步利用磁盘的随机读取性能,用户可设置4个Purge Thread中:

select version();\G;
show veriables like 'innod_purge_threads';
Page Cleaner Thread

在InnoDB1.2.X版本引入,作用是将之前版本中脏页的刷新都放到单独的线程中完成,减轻了Master的工作及对于用户查询线程的阻塞,进一步提高性能.

内存

猜你喜欢

转载自blog.csdn.net/yonggeit/article/details/82181567
今日推荐