本篇博客参考掘金小册--MySQL 是怎样运行的:从根儿上理解 MySQL 先给大家讲一个故事,我刚参加工作,在一个小作坊里面当[码畜](尽管现在也是),有一天老板从我背后走过,说了一句举世震惊的话:我看你们的数据库和excel一样,不就是一行行数据,人家excel还可以对单元格进行美化,还有各种函数,生成各种报表,你们的数据库有什么复杂的?我竟无力反驳. 为什么要说这个故事呢,当然是为了引出今天的话题--InnoDB的数据结构. 虽然做开发的各位,或多或少都接触过数据库,但是数据库中的一行行数…
如图,为B+树组织数据的方式: 实际存储时当然不会每个节点只存3条数据. 以InnoDB引擎为例,简单计算一下一颗B+树可以存放多少行数据. B+树特点:只有叶子节点存储数据,而非叶子节点存放的是用来找到叶子节点数据的索引(如上图:key和指针) InnoDB存储引擎的最小存储单元为16k(就像操作系统的最小单元为4k 即1页),在这即B+树的一个节点的大小为16k 假设数据库一条数据的大小为1k,则一个节点可以存储16条数据 而非叶子节点,key一般为主键假设8字节,指针在InnoDB中是6字…
本文转载自:Draveness,略有修改 原文链接:『浅入浅出』MySQL 和 InnoDB · 面向信仰编程 作为一名开发人员,在日常的工作中会难以避免地接触到数据库,无论是基于文件的 sqlite 还是工程上使用非常广泛的 MySQL.PostgreSQL,但是一直以来也没有对数据库有一个非常清晰并且成体系的认知,所以最近两个月的时间看了几本数据库相关的书籍并且阅读了 MySQL 的官方文档,希望对各位了解数据库的.不了解数据库的有所帮助. 本文中对于数据库的介绍以及研究都是在 MySQL…
如果创建表时没有显示的定义主键,mysql会按如下方式创建主键: 首先判断表中是否有非空的唯一索引,如果有,则该列为主键. 如果不符合上述条件,存储引擎会自动创建一个6字节大小的指针. 当表中有多个非空的唯一索引,会选择建表时第一个定义的非空唯一索引.注意根据的是定义索引的顺序,不是创建列的顺序. 表空间 tablespace(ibd文件) 段 segment(一个索引2个段) Extent(1MB) Page(16KB) Row Field 表空间 表空间可以看做是InnoDB存储引擎逻辑结构…
MySQL技术内幕:InnoDB存储引擎(第2版) 姜承尧 第1章 MySQL体系结构和存储引擎 >> 在上述例子中使用了mysqld_safe命令来启动数据库,当然启动MySQL实例的方法还有很多,在各种平台下的方式可能又会有所不同. >> 当启动实例时,MySQL数据库会去读取配置文件,根据配置文件的参数来启动数据库实例.这与Oracle的参数文件(spfile)相似,不同的是,Oracle中如果没有参数文件,在启动实例时会提示找不到该参数文件,数据库启动失败.而在MySQL数…
1.索引组织表:     在InnoDB存储引擎中,表都是依照主键顺序组织存放的.这样的存储方式的表称为索引组织表,在innodb存储引擎表中,每张表都有主键.假设创建的时候没有显式定义主键,则InnoDB会依照例如以下方式选择或者创建主键:  1). 首先推断表中是否有非空的唯一索引,假设有.则该列就为主键.  2).   假设不符合上述条件,则innodb会自己主动创建一个6字节大小的指针  假设表中有多个非空唯一索引时,InnoDB将选择建表时第一个定义的非空唯一索引为主键,通过_rowi…
近期碰到非常多锁问题.所以攻克了后,细致再去阅读了关于锁的书籍,整理例如以下:1,锁的种类 Innodb存储引擎实现了例如以下2种标准的行级锁: ? 共享锁(S lock),同意事务读取一行数据. ?  排它锁(X lock).同意事务删除或者更新一行数据. 当一个事务获取了行r的共享锁.那么另外一个事务也能够马上获取行r的共享锁,由于读取并未改变行r的数据.这样的情况就是锁兼容. 可是假设有事务想获得行r的排它锁,则它必须等待事务释放行r上的共享锁-这样的情况就是锁不兼容.二者兼容性例如以下表…
以下的资料总结自:官方文档和<MySQL技术内幕-INNODB存储引擎>一书. 对INNODB存储引擎缓冲池的那一段描述来自博文:http://www.ywnds.com/?p=9886说句实话这片博文写的很清楚,通过问答形式加紧逻辑性! 这篇文字会详细的说明INNODB存储引擎的体系结构及特性. INNODB存储引擎的内存管理 Checkpoint技术 INNODB存储引擎的关键特性 插入缓冲 DOUBLEWRITE AHI(自适应哈希索引) 异步IO 刷新临近页 INNODB的体系结构 首…
一.Mysql体系结构和存储引擎 1. 概念:              数据库:物理操作系统文件或其他形式文件类型的集合.(是文件的集合,是依照某种数据模型组织起来并存放于二级存储器中的数据集合.) 数据库实例:由数据库后台进程/线程以及一个共享内存区域组成.(是应用程序,是位于用户与操作系统之间的一层数据管理软件,用户对数据库的任何操作都是在数据库实例下进行的,应用程序只有通过数据库实例才能和数据库打交道.) 数据库是由一个一个文件组成的,如果要对这些文件执行诸如SELECT.INSERT.…
前文提到,对于 InnoDB 来说,随时都可以加锁(关于加锁的 SQL 语句这里就不说了,忘记的小伙伴可以翻一下上篇文章),但是并非随时都可以解锁.具体来说,InnoDB 采用的是两阶段锁定协议(two-phase locking protocol):即在事务执行过程中,随时都可以执行加锁操作,但是只有在事务执行 COMMIT 或者 ROLLBACK 的时候才会释放锁,并且所有的锁是在同一时刻被释放. 并且,行级锁只在存储引擎层实现,而对于 InnoDB 存储引擎来说,行级锁又分三种,或者说有三…