mysql
1基本知识
支持分区默认innodb引擎1-1常用引擎
myisammy-z[ei]minnodbin-no-db2数据类型
整数,tinyint1位/,smallint2位,mediumint3位,int4位,bigint8位2-1定点数
decimal(m,d)m1~65,d0~30默认0numeric(m,d)2-2浮点数
m0~,d0~30double(m,d)只保证16位有效数字,超出=decimalfloat(m,d)=doublerealasfloatreal(m,d)=double2-3二进制
bit(m)m1~64binaryvarbinaryblob2-4字符串
char(m)m0~固定长度,不够右边空格填充,取出时截掉varchar(m)m0~,与字符集有关系text2-5enum
单选字符串数据类型最多2-6set
多选字符串数据类型最多64个选项2-7时间日期类型
date,time,datatime,timestampdatatime
范围全范围8个字节存储与时区无关timestamp
范围~位存储与时区有关,不同时区数据不一样毫秒,微秒问题
mysql没有毫秒,微秒数据,需要程序自行处理mysql5.6.4后支持,datetime(3/6)或者timestamp(3/6)3约束
3-1主键,联合主键
会生成唯一索引加nonull约束产生聚集索引3-2外键
会生成索引3-3约束
唯一约束
会生成唯一索引可以为空产生非聚集索引区别:目的不同,唯一约束约束数据,唯一索引优化查询nonull高可用方式sql优化4索引
4-1底层结构
背景知识
系统从磁盘读取数据到内存时是以磁盘块(block)为基本单位的,位于同一磁盘块中的数据会被一次性读取出来,而不是按需读取。innodb存储引擎使用页作为数据读取单位,页是其磁盘管理的最小单位,默认page大小是16k。系统的一个磁盘块的存储空间往往没有这么大,因此innodb每次申请磁盘空间时都会是若干地址连续磁盘块来达到页的大小16kb。btree
如比查找29关键字模拟查找关键字29的过程:
1.根据根节点找到磁盘块1,读入内存。2.比较关键字29在区间(17,35),找到磁盘块1的指针p2。3.根据p2指针找到磁盘块3,读入内存。4.比较关键字29在区间(26,30),找到磁盘块3的指针p2。5.根据p2指针找到磁盘块8,读入内存。6.在磁盘块8中的关键字列表中找到关键字29。特性
1、关键字集合分布在整颗树中;2、任何一个关键字出现且只出现在一个节点中;3、每个节点存储data和key;4、搜索有可能在非叶子节点结束;5、一个节点中的key从左到右非递减排列;6、所有叶节点具有相同的深度,等于树高h。每个节点占用一个盘块的磁盘空间,一个节点上有两个升序排序的关键字和三个指向子树根节点的指针,指针存储的是子节点所在磁盘块的地址。b+tree(innodb举例)
设计初衷
innodb存储引擎在设计时是将根节点常驻内存的,力求达到树的深度不超过3,也就是说i/o不需要超过3次。分析b-tree的查找过程,发现需要3次磁盘i/o操作,和3次内存查找操作。由于内存中的关键字是一个有序表结构,可以利用二分法查找提高效率。在b-tree中,每个节点中有key,也有data,而每一个页的存储空间是有限的,如果data数据较大时将会导致每个节点(即一个页)能存储的key的数量很小,会导致b-tree的深度较大,增大查询时的磁盘i/o次数,进而影响查询效率。。数据结构图
b+tree的检索过程在b-tree的基础上有两点变化:
数据是存在叶子节点中的;数据节点之间是有指针指向的。page结构
page是整个innodb存储的最基本构件,也是innodb磁盘管理的最小单位,与数据库相关的所有内容都存储在这种page结构里。
page常见页类型
数据页(b-treenode)undo页(undologpage)系统页(systempage)事务数据页(transactionsystempage)等。单个page的大小是16k(编译宏univpagesize控制),每个page使用一个32位的int值来唯一标识,这也正好对应innodb最大64tb的存储容量(16kib*2^32=64tib)。page的基本结构
page的头部保存了两个指针,分别指向前一个page和后一个page,page链接起来就是一个双向链表的结构。主体内容
page的主体内容中主要