• 进入"运维那点事"后,希望您第一件事就是阅读“关于”栏目,仔细阅读“关于Ctrl+c问题”,不希望误会!
使用O_DIRECT/O_DIRECT_NO_FSYNC来提升MySQL性能

使用O_DIRECT/O_DIRECT_NO_FSYNC来提升MySQL性能

fsync()、fdatasync()、sync() 是什么? 首先它们是系统调用。 fsync(int fd) 系统调用把打开的文件描述符 fd 相关的所有缓冲元数据和数据都刷新到磁盘上(non-volatile storage,非易失性存储),等待写磁盘操作结束,然后返回。 fdatasync(int fd) 类似 fsync,但不 flush 元数据……

MySQL InnoDB插入意向锁

MySQL InnoDB插入意向锁

INSERT INTENTION LOCK,翻译为插入意向锁,锁类型为 LOCK_INSERT_INTENTION,其实准确来说应该是 INSERT INTENTION GAP LOCK,属于 GAP LOCK 子类。这个锁类型在老版本的 InnoDB 中并不存在,后来是为了优化插入性能而设计的。 INSERT INTENTION LOCK 在官方文档中的说……

堆表(HOT)和索引组织表(IOT)优缺点

堆表(HOT)和索引组织表(IOT)优缺点

一、堆表和索引组织表 NOTE 堆表也可以称之为 HOT,索引组织表也可以称之为 IOT,下面没有特别说明,两者都是一个意思。 堆(heap)组织表数据行在堆中存储,没有任何特定顺序,向一个全新的没有做过更新和删除的堆中插入一行时候,总是 append 到堆表文件的最后一页当中。因为不用考虑排序,所以插入速度会比较快。 但是要查找符合某个条件的记录,就必须得……

MySQL InnoDB RR隔离级别下INSERT…SELECT对SELECT表加锁模型和死锁案列

MySQL InnoDB RR隔离级别下INSERT…SELECT对SELECT表加锁模型和死锁案列

最近有网友遇到了在RR隔离级别下insert A select B where B.COL=** 由于select表也就是B表引发的死锁的问题。分析死锁日志后,笔者进行模拟重现了这位网友遇到了2种场景并且在本文中进行详细的描述。 本文使用版本Percona 5.7.14修改版,能够打印出事务所有的行锁信息结构链(不包含隐含锁) 本文中的测试是在RR隔离级……

MySQL ICP(Index Condition Pushdown)特性

MySQL ICP(Index Condition Pushdown)特性

一、SQL的where条件提取规则 在说 ICP(Index Condition Pushdown,索引条件下推) 特性之前,必须先搞明白根据何登成大神总结出一套放置于所有 SQL 语句而皆准的 where 查询条件的提取规则,为 ICP 提供理论支持。详情请看:SQL语句中where条件,在数据库中提取与应用浅析。 二、Index Condition Pu……

MySQL InnoDB联合索引学习

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索引原理及SQL优化

MySQL索引原理及SQL优化

MySQL凭借着出色的性能、低廉的成本、丰富的资源,已经成为绝大多数互联网公司的首选关系型数据库。虽然性能出色,但所谓“好马配好鞍”,如何能够更好的使用它,已经成为开发工程师的必修课,我们经常会从职位描述上看到诸如“精通MySQL”、“SQL语句优化”、“了解数据库原理”等要求。我们知道一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少……

MySQL InnoDB崩溃恢复流程

MySQL InnoDB崩溃恢复流程

InnoDB如果发生意外宕机了,数据会丢么?对于这个问题,稍微了解一点MySQL知识的人,都会斩钉截铁的回答:不会!为什么?他们也会毫不犹豫的说:因为有重做日志(redo log),数据可以通过redo log进行恢复。回答得很好,那么InnoDB怎样通过redo log进行数据的恢复的,具体的流程是怎样的?估计能说清楚这个问题的人剩的不多了,更深入一点:除……

MySQL InnoDB配置并发线程( innodb_thread_concurrency)

MySQL InnoDB配置并发线程( innodb_thread_concurrency)

一、thread_concurrency 首先,最重要的一点,这个参数已经在最新版本的MySQL中被移除了,官方MySQL 5.7版本的doc上面对thread_concurrency有这样的说明: thread_concurrency变量是针对于Solaris 8及低版本的系统,设置了这个变量MySQL会调用thr_setconcurrency()函数。这……

MySQL覆盖索引学习

MySQL覆盖索引学习

覆盖索引 通常大家会根据查询的where条件来创建合适的索引,不过这只是索引优化的一个方面。设计优秀的索引应该考虑到整个查询,而不单单是where条件部分。索引确实是一种查找数据的高效方式,但是MySQL也可以使用索引来直接获取列的数据,这样就不再需要读取数据行。如果索引的叶子节点中已经包含要查询的数据,那么还有必要再回表查询呢?如果一个索引包含,或者说覆盖……

MySQL InnoDB表空间传输的用途

MySQL InnoDB表空间传输的用途

在 MySQL 中如果要迁移一个表导另外一个服务器/环境中,常规的做法就是使用备份工具备份,比如 mysqldump/mysqlpump/mydumper,然后拷贝备份到目标服务器或者环境导入。如果某一个表数据量很大,导出 dump 文件很大的情况下,使用导出导入工具其实会花费不少的时间。 怎么样提高效率呢,可以有一种想法就是直接拷贝数据文件到目标环境,当然……

MySQL索引最左前缀原理与优化

MySQL索引最左前缀原理与优化

一、示例数据库 为了讨论索引策略,需要一个数据量不算小的数据库作为示例。本文选用MySQL官方文档中提供的示例数据库之一:employees。这个数据库关系复杂度适中,且数据量较大。下图是这个数据库的E-R关系图(引用自MySQL官方手册): MySQL官方文档中关于此数据库的页面为https://dev.mysql.com/doc/employee/en……