MYSQL数据库mysql innodb数据库引擎解析
《MYSQL数据库mysql innodb数据库引擎解析》要点: MYSQL实例本节内容: MYSQL实例一.mysql体系结构和存储引擎 MYSQL实例1.1、数据库和实例的区别 MYSQL实例数据库:物理操作系统或其他形式文件类型的集合.在mysql下数据库文件可以是frm,myd,myi,ibd结尾的文件. MYSQL实例数据库实例:由数据库后台进程/线程以及一个共享内存区组成.数据库实例才是真正用来操作数据库文件的. MYSQL实例mysql数据库是单进程多线程的程序,与sql server比较类似.也就是说,Mysql数据库实例在系统上的表现就是一个进程. MYSQL实例1.2、mysql的体系结构 MYSQL实例mysql由连接池组件、管理服务和工具组件、sql接口组建、查询分析器组件、优化器组件、缓存组件、插件是存储引擎、物理文件. MYSQL实例1.3、mysql存储引擎 MYSQL实例1.3.1、innodb存储引擎,特点支持外键、行锁、非锁定读(默认情况下读取不会产生锁)、mysql-4.1开始支持每个innodb引擎的表单独放到一个表空间里.innodb通过使用MVCC来获取高并发性,并且实现sql标准的4种隔离级别,同时使用一种被称成next-key locking的策略来避免换读(phantom)现象.除此之外innodb引擎还提供了插入缓存(insert buffer)、二次写(double write)、自适应哈西索引(adaptive hash index)、预读(read ahead)等高性能技术. MYSQL实例1.3.2、myisam存储引擎,myisam特点是不支持事物,适合olap应用,myisam表由MYD和MYI组成.mysql-5.0版本之前,myisam默认支持的表大小为4G,从mysql-5.0以后,myisam默认支持256T的表单数据.myisam只缓存索引数据. MYSQL实例1.3.3、NDB存储引擎,特点是数据放在内存中,mysql-5.1版本开始可以将非索引数据放到磁盘上.NDB之前的缺陷是join查询是mysql数据库层完成的,而不是存储引擎完成的,复杂的join查询需要巨大的网络开销,速度很慢.当前mysql cluster7.2版本中已经解决此问题,join查询效率提高了70倍. MYSQL实例1.3.4、memeory存储引擎,将数据放到内存中,默认使用hash索引,不支持text和blob类型,varchara是按照char的方式来存储的.mysql数据库使用memory存储引擎作为临时表还存储中间结果集(intermediate result),如果中间集结果大于memorg表的容量设置,又或者中间结果集包含text和blog列类型字段,则mysql会把他们转换到myisam存储引擎表而放到磁盘上,会对查询产生性能影响. MYSQL实例1.3.5、archive存储引擎,压缩能力较强,主要用于归档存储. MYSQL实例1.3.6、federated存储引擎,不存储数据,他指向一台远程mysql数据库上的表. MYSQL实例1.3.7、maria存储引擎,myisam的后续版本,支持缓存数据和索引,行锁设计,支持mvcc,支持事务和非事务安全的选项,以及更好的BLOG字符类型的处理性能. MYSQL实例1.3.8、其他存储引擎,sphinx用于全文索引,infobright用于数据仓库. MYSQL实例1.4连接Mysql MYSQL实例1.4.1、TCP/IP:基于网络的连接,连接进行权限检查. MYSQL实例1.4.2、命名管道和共享内存:Windows系统上同一服务器上的两进程可通过命名管道连接,需在配置文件中启用--enable-named-pipe选项. MYSQL实例1.4.3、Unix套接字:客户端与服务端位于同一服务器时才可使用,可以在my.cnf中指定-socket=/tmp/mysql.sock,连接时指定./mysql -S/tmp/mysql.sock. MYSQL实例二.InnoDB存储引擎 MYSQL实例2.2、innodb引擎架构 MYSQL实例1).维护所有进程/线程需要访问的多个内部数据结构. MYSQL实例2).缓存磁盘上的数据,方便快速的读取,并且在对磁盘文件的数据进行修改之前在这里缓存. MYSQL实例3).重做日志缓存. MYSQL实例后台线程的主要作用是负责刷新内存池中的数据,保证缓冲池中的内存缓存是最近的数据,此外、将已经修改的数据文件刷新到磁盘文件 MYSQL实例2.2.1、后台线程 MYSQL实例innodb存储引擎后台有7个线程,—–4个IO线程(insert buffer thread,log thread,read thread,write thread),1个master thread,一个lock监控线程,一个错误监控线程. MYSQL实例2.2.2、内存 MYSQL实例innodb存储引擎内存由以下三个部分组成:缓冲池(buffer pool),重做日志缓存(redo log buffer),额外的内存池(additional memory pool).可以使用 show engine innodb status来查看innodb_buffer_pool的使用情况. MYSQL实例innodb_buffer_pool_size:具体看,缓冲池中的数据库类型有:索引页、数据库页、undo页、插入缓存页(insert buffer)、自适应hash(adaptive hashindex)、innodb存储的锁信息(lock info)、数据字典信息(data dictionary). MYSQL实例InnoDB工作方式:将数据文件按页(每页16K)读入InnoDBbuffer pool,然后按最近最少使用算法(LRU)保留缓存数据,最后通过一定频率将脏页刷新到文件. MYSQL实例 MYSQL实例 MYSQL实例2.3.1、master thread源码分析 MYSQL实例2.3.2、master thread的潜在问题 MYSQL实例1、由于硬件的发展,现在的硬件性能已经提高了很多,如果innodb每秒最大刷新100个脏页,那么效率会很低,为了解决这个问题,innodb plugin提供了一个参数innodb_io_capacity,用来表示磁盘IO的吞吐量,默认值是200,规则如下:在合并插入缓存时,合并插入缓存的数量为innodb_io_capacity的5%;在从缓冲区刷新脏页时,啥新脏页的数量为innodb_io_capacity. MYSQL实例2、关于innodb_max_dirty_pages_pct值的争议,如果值过大,内存也很大或者服务器压力很大,那么效率很降低,如果设置的值过小,那么硬盘的压力会增加,建议是在75-80.并且innodb plugin引进了innodb_adaptive_flushng(自适应的刷新),该值影响每秒刷新脏页的数量. MYSQL实例2.4、关键特性,为innodb提高性能的技术 MYSQL实例2.4.1、插入缓存 MYSQL实例当一个表有非聚集索引时,对于非聚集索引的叶子节点的插入不是顺序的,这时候需要离散的访问非聚集索引页,性能就在这里降低了,这是由于b+树的原理导致的.插入缓存就是用来解决这个问题的. MYSQL实例对于非聚集索引的插入和更新操作,不是每一次都直接插入索引页,而是先判断插入的非聚集索引页是否在缓存中,如果在就直接插入,如果不在就放入到一个插入缓冲区中,好似欺骗数据库这个非聚集索引已经插入到叶子节点了.然后再以一定的频率插入缓存和非聚集索引页字节点的合并操作. MYSQL实例插入缓存的使用需要满足以下两个条件(也就是非唯一的辅助索引):索引是辅助索引;索引不是唯一的. MYSQL实例2.4.2、两次写 MYSQL实例两次写给innodb带来的是可靠性,主要用来解决部分写失败(partial page write).在应用重做日之前,我们需要一个页的副本,当写入失效发生时,先通过页的副本来还原该页,再进行重做,这就是doublewrite. MYSQL实例doublewrite有两部分组成,一部分是内存中的doublewrite buffer,大小为2M,另外一部分就是物理磁盘上的共享表空间中联系的128个页,即两个区,大小同样为2M.当缓冲池的张也刷新时,并不直接写硬盘,而是回通过memcpy函数将脏页先拷贝到内存中的doublewrite buffer,之后通过doublewrite buffer再分两次写,每次写入1M到共享表空间的物理磁盘上,然后马上调用fsync函数,同步磁盘. MYSQL实例2.4.3、自适应哈西索引 MYSQL实例由于innodb不支持hash索引,但是在某些情况下hash索引的效率很高,于是出现了 adaptive hash index功能,innodb存储引擎会监控对表上索引的查找,如果观察到建立hash索引可以提高性能的时候,则自动建立hash索引. MYSQL实例2.5、启动、关闭、恢复 MYSQL实例0 MySQL关闭时 完成所有的full purge和merge insertbuffer操作 MYSQL实例1默认值 只将缓冲池内的一些脏页刷新至磁盘 MYSQL实例2将日志都写入日志文件不会有任何事务丢失但下次启动时会进行recovery MYSQL实例三.文件 MYSQL实例3.1参数文件 MYSQL实例3.1.1、什么是参数 MYSQL实例3.1.2、参数类型 MYSQL实例3.2、日志文件 MYSQL实例3.2.1、错误日志 MYSQL实例3.2.2、慢查询日志 MYSQL实例3.2.3、查询日志 MYSQL实例3.2.4、二进制日志 MYSQL实例注意:针对系统库mysql里面的表发生变化的处理规则如下: MYSQL实例3.3、套件字文件 MYSQL实例3.4、pid文件和表结构定义文件 MYSQL实例pid文件是实例启动是记录自己进程ID号的文件,表结构定义文件是以frm为后缀名的文件,还可以用来存放视图的定义. MYSQL实例3.5、innodb引擎文件 MYSQL实例3.5.1、表空间文件 MYSQL实例3.5.2、重做日志文件 MYSQL实例因为重做日志条目先被写到日志缓冲中,然后根据一定条件刷新到磁盘重做日志文件中.与redo log相关的就是innodb_flush_log_at_trx_commit的值,对innodb的性能影响很大.他有0,1,2三个值,0代表提交事务时,并不同步写redo log,而是等master threas每秒写.1代表commit的时候就将redo log缓存写入磁盘,2代表commit的时候将redo log缓存异步的写入磁盘. MYSQL实例就是这些了,有关mysql innodb数据库引擎的详细介绍,希望对大家有所帮助. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |