0%

Innodb索引页文件结构

FIL Header:

  • checksum:4个字节32位checksum保存在header中。
  • Offset:Page Number,page初始化时就被保存在header中。
  • Previous/Next Page:指向前/后一页的指针,被保存在header中,允许构建成双向链表,从而连接所有相同等级的页。
  • page type:保存在header中,为了解析page数据,这个字段是必须的。
  • space ID:保存在header中,space的32位整型唯一编号。
  • Old-style Checksum:老格式32位checksum被保存在trailer中,不过已经被废弃,这块空间被申明为一些指针。
  • LSN:log sequence number。

JMM

JMM(Java Memony Mode)java内存模型,JMM描述了java线程如何通过内存进行交互,java程序中各种变量(线程共享变量)的访问规则,以及在jvm中将变量存储到内存和从内存中读取出变量的底层细节

  • 所有变量都存储在主内存
  • 每个线程都有自己独立的工作内存,里面保存该线程使用到的变量的副本

有两条规定

  • 线程对共享变量的所有操作都必须在自己的工作内存中进行,不能直接从主内存中读写
  • 不同线程之间无法直接访问其他线程工作内存中的变量,线程间变量值的传递需要通过主内存来完成

happens-before

编码

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

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

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

数据库范式

第一范式

保证属性不可分

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

第二范式

非主属性完全依赖于码

阅读全文 »

MySQL索引结构

MySQL内置的存储引擎对各种索引技术有不同的实现方式,包括:B-树,B+树,R-树以及散列类型

MySQL内置的存储引擎对各种索引技术有不同的实现方式,包括:B-树,B+树,R-Tree索引、hash索引、full-text全文索引

  • Innodb中使用的是B+树索引
  • MyISAM中使用的是FullText全文索引, InnoDB在5.6之后支持,5.7之后使用ngram插件开始支持中文
  • Memory中使用的是Hash索引

索引结构

B-树

这种索引我是没有使用过,因为从最一开始我就使用的innodb存储引擎,而B-树是存在于MyISAM存储引擎中的

MyISAM存储引擎使用B-树数据结构来实现主码索引、唯一索引以及非主码索引。在MyISAM实现数据目录和数据库模式子目录中,用户可以找到每个MySQL表对应的.MYD和.MYI文件。数据库表上定义的索引信息就存储在MYI文件中,该文件的块大小是1024字节。这个大小是可以通过myisam-block-size系统变量分配。

在MyISAM中,非主码索引的B-树结构存储索引值和一个指向主码数据的指针,这是MyISAM和InnoDB的一个显著区别。

阅读全文 »

内存溢出和内存泄漏

内存溢出

内存溢出(OutOfMemoryError,简称OOM)是指没有空闲内存,且垃圾收集器也无法提供更多的内存

出现OOM的原因有两种:

  • java虚拟机设置的堆内存不够
  • 代码中创建了大量大对象,并且长时间不能被垃圾收集器收集

内存泄漏

可达性分析算法来判断对象是否是不再使用的对象,本质是判断一个对象是否还被引用,内存泄漏是指对象不会被程序用到了,但是GC又无法回收这些对象的情况,内存泄漏会逐渐的占用内存,直至耗尽所有内存,最终出现OOM

阅读全文 »

MySQL查询缓存

MySQL在查询的时候首先会查询缓存,如果缓存命中的话就直接返回结果,不需要解析sql语句,也不会生成执行计划,更不会执行;如果没有命中缓存,则再进行SQL解析以及进行查询,并将结果返回(也同时将结果放入到缓存中)

MySQL查询过程

缓存查找是利用对大小写敏感的哈希查找来实现的,Hash查找只能进行全值查找(sql完全一致),如果缓存命中,检查用户权限,如果权限允许,直接返回,查询不被解析,也不会生成查询计划,由于在缓存更新的时候会对数据加锁,所以对于读写比较频繁的系统,建议关闭缓存

阅读全文 »

MySQL系统配置

内存相关

  • sort_buffer_size 定义了每个线程排序缓存区的大小,MySQL在有查询、需要做排序操作时才会为每个缓冲区分配内存(直接分配该参数的全部内存)(innodb_sort_buffer_sizemyisam_sort_buffer_sizesort_buffer_size)
  • join_buffer_size 定义了每个线程所使用的连接缓冲区的大小,如果一个查询关联了多张表,MySQL会为每张表分配一个连接缓冲,导致一个查询产生了多个连接缓冲
  • read_buffer_size 定义了当对一张MyISAM进行全表扫描时所分配读缓冲池大小,MySQL有查询需要时会为其分配内存,其必须是4k的倍数
  • read_rnd_buffer_size MySQL的随机读缓冲区大小,MySQL有查询按任意顺序读取行需要时会为其分配内存,进行排序查询时,MySQL会首先扫描一遍该缓冲,以避免磁盘搜索,提高查询速度,如果需要排序大量数据,可适当调高该值

上述四个参数配置是按照每个线程进行分配的,所分配的内存还要乘以线程数

  • innodb_buffer_pool_size 定义了Innodb所使用缓存池的大小,对其性能十分重要,必须足够大,但是过大时,使得Innodb 关闭时候需要更多时间把脏页从缓冲池中刷新到磁盘中

  • key_buffer_size 定义了MyISAM所使用的缓存池的大小,由于数据是依赖存储操作系统缓存的,所以要为操作系统预留更大的内存空间

    即使开发使用的表全部是Innodb表,也要为MyISAM预留内存,因为MySQL系统使用的表仍然是MyISAM表

阅读全文 »

MySQL数据存储

Innodb存储引擎的数据存储,可以使用两种方式进行存储:系统表空间和独立表空间

1
2
3
-- ON表示使用的是独立表空间
-- OFF表示使用的是系统表空间
show variables like '%innodb_file_per_table%'

系统表空间(共享表空间)

在MySQL5.5之前默认使用的是系统表空间,系统表空间是指每一个数据库所有的表数据,索引文件全部放在一个文件中,文件名为ibdataX(X代表第几个文件,从1开始),默认初始化是12M

1
2
3
4
5
show variables like 'innodb_data%';

Variable_name Value
innodb_data_file_path ibdata1:12M:autoextend
innodb_data_home_dir

autoextend表示自动扩展,当文件存储满时会自动进行扩展,默认增量是64M

1
2
3
4
show variables like 'innodb_autoextend_increment';

Variable_name Value
innodb_autoextend_increment 64
阅读全文 »