0%

Innodb索引页文件结构

首先Mysql的基本存储结构是页,Mysql中的存取数据是按照页进行存取的,在查找数据的时候是需要先定位到记录所在页,再从所在页中查找到相应的记录

数据页以一个双向链表维持着顺序,每个数据页以单向链表的格式对记录RowId进行逻辑排序,并且每个数据页之间的记录进行物理排序

存储结构

由7部分组成

  • File Header 文件头,大小固定,为38字节
  • Page Header 页头,大小固定,为56字节
  • Infimum 和 Supremum Record
  • User Records 用户记录
  • Free Space 空闲空间
  • Page Directory 页目录
  • File Trailer 文件结尾信息,大小固定,为8字节
阅读全文 »

JMM

CPU的运算能力远远超出了主内存的读取数据能力,所以在CPU中存在高速缓存区Cache来作为内存和处理器之间的缓冲(将运算需要使用的数据复制到缓存中,让运算能快速的进行,当运算结束后再从缓存同步回内存之中,这样处理器就无需等待内存读写了),使得CPU在运算过程中直接从高速缓存区中读取数据,其在单线程下是没有问题的,且性能也有了很大的提升。但是在多线程中由于多核CPU每个处理器都有自己的缓存区,导致了数据不一致性,也就是缓存一致性问题。而JMM内存模型就是用来解决该问题的

内存模型

JMM(Java Memony Model)java内存模型,主要目标是定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量(包括实例变量、静态变量和构成数组对象的元素,但不包括局部变量与方法参数,因为其是线程私有的,不会存在竞争问题)的底层细节,JMM描述了java线程如何通过内存进行交互,java程序中各种变量(线程共享变量)的访问规则,以及在jvm中将变量存储到内存和从内存中读取出变量的底层细节,决定一个线程对共享变量的写入何时对另一个线程可见

  • 线程之间的共享变量都存储在主内存
  • 每个线程都有自己独立的工作内存,里面保存该线程使用到的变量的主内存副本拷贝,线程读写变量时操作的是自己工作内存中的变量(线程操作共享变量时,先从主内存复制共享变量到自己的工作内存,然后对工作内存里的变量进行处理,处理完之后将变量值更新到主内存),不可以直接操作主内存的变量
  • 线程A无法直接访问线程B的工作内存,必须经过主内存
  • 堆内存在线程之间共享,局部变量、方法参数、异常处理器参数不会在线程之间共享
阅读全文 »

编码

gbk编码:中文占2个字节,英文占1个字节

utf-8编码:中文占3个字节,英文占1个字节

utf-16编码:中文占2个字节,英文占2个字节

数据库范式

第一范式1NF

字段具有原子性,保证字段不可分

数据库表中的所有字段都是单一属性,不可再分

第二范式2NF

在第一范式的基础上,非主属性完全依赖于码

阅读全文 »

MySQL系统调优

可以使用下面几个工具来做基准测试: