使用O_DIRECT/O_DIRECT_NO_FSYNC来提升MySQL性能
fsync()、fdatasync()、sync() 是什么? 首先它们是系统调用。 fsync(int fd) 系统调用把打开的文件描述符 fd 相关的所有缓冲元数据和数据都刷新到磁盘上(non-volatile storage,非易失性存储),等待写磁盘操作结束,然后返回。 fdatasync(int fd) 类似 fsync,但不 flush 元数据……
MySQL InnoDB插入意向锁
INSERT INTENTION LOCK,翻译为插入意向锁,锁类型为 LOCK_INSERT_INTENTION,其实准确来说应该是 INSERT INTENTION GAP LOCK,属于 GAP LOCK 子类。这个锁类型在老版本的 InnoDB 中并不存在,后来是为了优化插入性能而设计的。 INSERT INTENTION LOCK 在官方文档中的说……
查看InnoDB表每个索引的高度?
我们知道InnoDB表是索引组织表,分为聚集索引和二级索引,但不管哪种索引,其结构都是B+树结构。由于InnoDB B+树结构高扇区特性,所以每个索引高度基本在3-4层之间,如果数据量比较大,页比较小,如4K,那么高度也是可能破4的。问题来了,以上说法都是我们根据理论知识计算得出的结果,那么在InnoDB中如何查看每个索引的高度呢?InnoDB也没有提供相应……
堆表(HOT)和索引组织表(IOT)优缺点
一、堆表和索引组织表 NOTE 堆表也可以称之为 HOT,索引组织表也可以称之为 IOT,下面没有特别说明,两者都是一个意思。 堆(heap)组织表数据行在堆中存储,没有任何特定顺序,向一个全新的没有做过更新和删除的堆中插入一行时候,总是 append 到堆表文件的最后一页当中。因为不用考虑排序,所以插入速度会比较快。 但是要查找符合某个条件的记录,就必须得……
MySQL InnoDB RR隔离级别下INSERT…SELECT对SELECT表加锁模型和死锁案列
最近有网友遇到了在RR隔离级别下insert A select B where B.COL=** 由于select表也就是B表引发的死锁的问题。分析死锁日志后,笔者进行模拟重现了这位网友遇到了2种场景并且在本文中进行详细的描述。 本文使用版本Percona 5.7.14修改版,能够打印出事务所有的行锁信息结构链(不包含隐含锁) 本文中的测试是在RR隔离级……
使用innodb_ruby分析InnoDB内部结构
一、innodb_ruby 介绍 如果你想了解 MySQL InnoDB 内部结构,不好意思,官方在 5.7 版本之前并没有什么好的工具。所以你只能自己写一个工具去分析表空间文件或使用别人开源的工具,比如innodb_ruby。在 MySQL 5.7 版本,官方加强了innochecksum工具,使之也可以简单分析表空间,比如查看页类型统计信息等。但跟 Je……
MySQL ICP(Index Condition Pushdown)特性
一、SQL的where条件提取规则 在说 ICP(Index Condition Pushdown,索引条件下推) 特性之前,必须先搞明白根据何登成大神总结出一套放置于所有 SQL 语句而皆准的 where 查询条件的提取规则,为 ICP 提供理论支持。详情请看:SQL语句中where条件,在数据库中提取与应用浅析。 二、Index Condition Pu……
MySQL InnoDB离线校验工具innochecksum使用
innochecksum工具可以打印InnoDB文件的校验值,该工具读取InnoDB表空间文件,计算每个页面的校验值,将计算的校验值与存储的校验值进行比较,并报告指示损坏页面的不匹配。它最初是为了加速验证断电后表空间文件的完整性而开发的,也可以在文件复制后使用。由于校验值不匹配导致InnoDB故意关闭正在运行的服务器,因此最好使用此工具而不是等待生产服务器遇……
MySQL InnoDB锁信息阅读
下面主要分析一下 InnoDB 加锁的详细信息,主要用于分析一条语句的详细加锁结构以及加了什么锁。 记得先打开 InnoDB monitor 中的锁详细信息输出,只在 MySQL 下有用,在 MariaDB 下不起作用。 set GLOBAL innodb_status_output_locks=ON; ……
MySQL InnoDB统计信息的收集与作用
我们知道索引可以加快查询速度,那么是不是只要是查询语句需要,就建上索引?答案是否定的。因为索引虽然加快了查询速度,但索引也是有代价的:索引文件本身要消耗存储空间,同时索引会加重插入、删除和修改记录时的负担,另外,MySQL 在运行时也要消耗资源维护索引,因此索引并不是越多越好。一般两种情况下不建议建索引。 第一种情况是表记录比较少,例如一两千条甚至只有几百条……
MySQL InnoDB联合索引学习
联合索引是指对表上的多个列进行索引,其创建方法与单个索引一样,不同之处仅在于有多个索引列。例如,以下代码创建了一张t表,并且索引idx_a_b是联合索引,联合的列为(a,b)。 create table t( a int, b int, primary key(a), key idx_a_b(a,b) ……
MySQL InnoDB磁盘I/O优化
一、影响SQL执行性能因素 影响SQL执行性能的关键就在于磁盘,数据库优化大部分工作都是在做磁盘的优化,比如尽可能把随机读写转换为顺序读写、预读、加大buffer pool、优化SQL尽量无磁盘操作等。 mysql> show global status like 'i%read%'; +----------------……