mysql
1基础知识
支持分区
默认innodb引擎
1-1公共引擎
My isam My-Z[EI]M
InnoDB In-No-DB
2数据类型
整数。小int 1位127/255,小int 2位,中int 3位,int 4位,大int 8位
2-1定点
十进制(m,d) m1 ~ 65,d0 ~ 30默认0
数值(m,D)
2-2浮点数
m 0~255,d0 ~ 30
双(m,D)取出时,切断
varchar(m) m 0~65535,
text
2-5 enum
无线电字符串数据类型
max 65535
2-6 set
多选择字符串数据类型
max 64 options
2-7时间日期不同时区的数据是不同的
毫秒,微秒问题
msql没有毫秒和微秒数据,这需要在程序处理
msql 5 . 6 . 4、日期时间(3/6)或时间戳(3/6)
3约束3-1主键之后得到支持。联邦主键
生成唯一索引
加上无空约束
生成聚集索引
3-2外键
生成索引
3-3约束唯一约束
生成唯一索引
可以生成非聚集索引
差异:不同的目的、唯一约束和约束数据、唯一索引优化查询
。innodb存储引擎使用页面作为数据读取单元。页面是磁盘管理的最小单位。默认页面大小为16k
系统中一个磁盘块的存储空间通常不太大,因此innodb每次申请磁盘空间时都会使用几个连续的磁盘块来达到16kb的页面大小。
btree
与查找键29:
1的键
相比,模拟查找键29的过程。根据根节点,找到磁盘块1并将其读入内存[磁盘输入/输出操作1]
2。比较键29在区间(17,35)中,并且找到磁盘块1的指针p2
3。根据p2指针找到磁盘块3并读入内存[磁盘i/o操作2]
4。比较间隔(26,30)中的键29,找到磁盘块3的指针p2
5。根据p2指针找到磁盘块8并读入内存[磁盘输入输出操作第3号]
6。关键字29在磁盘块8的关键字列表中找到
功能
1,关键字集分布在整个树中;
2,出现任何关键字,并且只出现在一个节点中;
3,每个节点存储数据和密钥;;
4,搜索可以在非叶节点结束;
5,节点中的键从左到右不递减;
6,所有叶节点具有相同的深度,等于树高h
的每个节点占用一个磁盘块的磁盘空间,一个节点有两个升序键和三个指向子树根节点的指针。指针存储子节点所在磁盘块的地址
b+树(例如innodb)
innodb存储引擎的最初设计意图是在设计期间存储驻留在根节点的内存,并努力达到树的深度不超过3倍,即i/o不需要超过3倍。
分析了b树的搜索过程,发现它需要3次磁盘i/o操作和3次内存搜索操作。由于内存中的关键字是有序表结构,二分法搜索可以用来提高效率。b树中的
,每个节点都有密钥和数据,每页的存储空间有限。如果数据很大,每个节点(即一页)中可以存储的密钥数量将非常少,这将导致b树的深度很大,增加查询期间磁盘i/o的数量,并进一步影响查询效率。基于b树,
数据结构图
b+树的检索过程有两个变化:
数据存在于叶节点中;
个数据节点之间有指针
页结构页是整个innodb存储的最基本组件,也是innodb磁盘管理的最小单元。与数据库相关的所有内容都存储在此页面结构中。页面公共页面类型
数据页面(b树节点)
撤销页面(撤销日志页面)
系统页面(系统页面)
事务系统页面等。
单页的大小为16k(编译后的宏univpagesize控件)。每页由32位int值唯一标识,该值也对应于innodb的最大存储容量64tb(16kib * 2^32 = 64tb)
页的基本结构
页的标题分别包含指向上一页和下一页的两个指针。页面被链接以形成双链表结构
主体内容
页主体内容主要集中于行数据和索引的存储。所有这些都位于页面的用户记录部分。
个用户记录占据了页面中的大部分页面空间。用户记录由一个接一个的记录组成,每个记录代表索引树上的一个节点(非叶节点和叶节点)。
单个链表的头和尾由两个固定内容的记录表示,字符串形式的“输入”表示开始,“上确”表示结束。用于表示开始和结束的两个记录存储在系统记录段中。系统记录和用户记录是两个平行的部分。
innodb中有4条不同记录,分别是1个主键索引树非叶节点2个主键索引叶子节点3个次键索引树非叶节点4个次键索引叶子节点用户记录以单个链接列表的形式存在于页面中。初始数据按插入顺序排列。然而,随着新数据的插入和旧数据的删除,数据的物理顺序将变得混乱,但它们仍然保持逻辑优先顺序。
4-2公共索引类型(逻辑分类)
主键索引
常规索引(非主键)
唯一索引
复合索引
多列创建的索引称为重合索引
前缀索引
当索引的字符串列很大时,创建的索引变大。为了减小索引的大小,提高索引的扫描速度,索引的前部用于索引,这样索引所占用的空间将会大大减少,索引的选择性也不会大大降低。此外,如果blob和文本列被索引,或者非常长的varchar列,则必须使用前缀索引,因为mysql不允许对它们的全长进行索引
全文索引
innodb引擎对全文索引的支持是mysql5.6新引入的功能。以前,只有myisam引擎支持全文索引可以使用match()查询全文索引的内容...违反语法在版本
mysql 5.6
之前,只有myisam引擎支持全文索引,并且可以使用match()...对照语法查询
只支持英语原因是他总是用空格作为分词的分隔符。然而,对于汉语来说,使用空格显然是不合适的,汉语语义需要分词。
mysql 5.6
innodb支持全文索引
mysql 5.7更高版本
yisam,innodb支持全文索引
支持中文索引
外键索引
它可以提高查询效率,外键将自动与相应其他表的主键相关联外键的主要功能是确保记录的一致性和完整性
不建议使用外键,在应用层使用外键的想法确保了数据的一致性和完整性。使用覆盖索引扫描的
覆盖索引
查询可以直接使用节点页面中的主键值(详见下图中的索引数据结构)
4-3索引类型-叶节点数据分类聚类索引
叶节点存储索引和数据记录行
聚类索引。每个叶节点包含主键值、事务id、事务回滚指针和mvcc(多版本控制)以及所有剩余列
的优势提高了数据访问性能:聚集索引将索引和数据保存到同一b+树数据结构中,同时将索引列和相关数据行保存在一起这意味着当您访问同一数据页的不同行记录时,该页已加载到缓冲区中,当您再次访问它时,访问将在内存中完成,而无需访问磁盘。
不同于myisam引擎(非聚集索引)。它将索引和数据放在不同的物理文件中,而不是一个。索引文件缓存在key_buffer中。索引对应于磁盘位置,磁盘数据必须通过磁盘位置访问。
的缺点是,当插入新行或更新主键时,基于聚集索引的表可能面临“页面拆分”的问题,导致需要移动行。页面拆分会导致表占用更多磁盘空间
建议在插入大量新行后负载较低时通过优化表来优化表,因为必须移动的行数据可能会导致碎片。使用独占表空间会削弱片段
表。如果uuid用作使数据存储稀疏的主键,则集群索引可能比全表扫描更新
。建议将int的auto_increment作为主键
。如果主键相对较大,辅助索引将变得更大,因为辅助索引的叶存储主键值。主键值太长将导致非叶节点占用更多物理空间
非聚集索引(辅助索引)
叶节点存储索引和相应的数据记录指针(或主键)
4-4索引扫描方法紧凑索引扫描(密集索引)
根据排序的tid从磁盘获取行数据。readrndbuffer _ size-冗余单向排序
中的
文件排序过程的区别在于,所有相关数据都是首次获得,而不仅仅是tid。因此,当与orderby字段结合使用时,没有必要从辅助磁盘获取
文件排序优化
来增加相关参数大小
以增强文件系统io
10-6限制优化
,如果orderby字段重复,则有必要增加order by列。否则,数据将出现错误的
10-7指数问题。最常用的复合指数
放在前面。没有与订单无关的
10-8通用优化解释选择_类型
9简单。没有并集或子查询
primary。导出并导出嵌套中的最外层[prameri]
联合/联合结果/从属联合/从属联合
导出。子查询生成一个临时表[第
子查询。子查询的第一个select语句
type
const最多是一个。系统的特例只有一个
eq_ref。这是一个索引访问,只返回一个,并且索引是唯一的,primary
ref,并且返回多个。索引是最左边的前缀,可用于= & lt>;
参考,对于1995年后支持的null
index _ merge、index merge optimization
| 1,一个表可以使用多个索引index intersect
unique _ subquery。子查询
index_subquery中的替换子查询
范围中的替换,使用索引检索范围的行
索引,使用fileport完全扫描索引
all
extra
,使用临时
不读取排序
注意使用index
使用index条件
密钥
ref的长度使用哪一列来选择行
profile
11 mysql锁机制1-1 innodb
常用的
行级锁功能
锁粒度小
锁获取和释放复杂性高
并发性高
易死锁
分类防止锁升级到表锁
控制事务大小(数据卷操作)
减少锁定资源的数量
减少锁定时间
减少死锁的发生
在类似的服务模块中,尽可能以相同的访问顺序在同一事务中访问
。一个锁所需的所有资源
都可以尽可能地实现。对于非常容易死锁的业务部分,可以尝试升级锁粒度。通过表级锁
1-2 myisam
不常用
表级锁功能
锁粒度大
锁获取和释放简单
并发性低
读取表时死锁不易发生
读写相互阻塞