/images/avatar.png

MySQL性能调优(1)理解底层B+tree机制

索引是谁实现的

索引是存储引擎实现的: 本文章主要对MySQL常用的MyISAM与InnoDB这两个存储引擎做分析。

索引是什么

索引是为了加速对表中的数据行的检索而创建的一种分散存储的数据结构

为什么要用索引

  1. 索引能极大的减少存储引擎需要扫描的数据量。(比如全表扫描就是在找数据)
  2. 索引可以把随机IO变成顺序IO。(因为索引是有序的这样就能保证找数据的时候稳定性,在程序中不允许有不稳定因素。)

为什么MySQL要用b+tree来实现索引

在这里先推荐一个网址来学习二叉树由来地址

  1. 先来看看二叉查找树 Binary Search Tree https://yakax.oss-cn-hangzhou.aliyuncs.com/blog/mysql/28.png

  2. 在来看看平衡二叉查找树(所有节点数高度不会超过1)AVL Trees (Balanced binary search trees)记住图上的磁盘块上存储了数据区的磁盘地址。 https://yakax.oss-cn-hangzhou.aliyuncs.com/blog/mysql/29.png

  3. 说说为什么MySQL没有选择这些算法而去选择B+Tree

    • 它太深了,数据存在的(高)深度决定着他的IO操作次数,IO操作耗时大这个大家都是知道的。
    • 他太小了,IO操作是很耗时,他一次IO也只能加载一个关键字;保存的东西太少了。
    • 没有很好的利用操作磁盘IO的数据交换特性(操作系统通过硬盘读取数据一次IO操作读取的大小是4k(页为单位)) 这就是为什么SSD在分区时选择4k对其的原因,能使他大大提升读写性能。 二叉树每个节点只有一个关键字,他是存满不了4k的,这样会浪费资源。
    • 也没有利用好磁盘IO的预读能力(空间局部性原理),从而带来频繁的IO操作。空间局部性原理就是: 操作系统每次IO操作读取一页,他会有预读能力,把下一页或者后面几页的数据读取。(注:MySQL定义的一页为16k)

单例设计模式

单例的好处

单例模式的初衷就是为了使资源能够共享,只需要赋值或者初始化一次,大家都能够重复利用。 一个类Class只有一个实例存在。 使用Singleton的好处还在于可以节省内存,因为它限制了实例的个数,有利于Java垃圾回收;常见的单例有枚举常量类、IOC容器、配置项等等。

普通单例模式-饿汉式

1
2
3
4
5
6
7
8
public class Singleton {
    private static Singleton singleton = new Singleton();
    private Singleton() {
    }
    public static Singleton getInstance() {
        return singleton;
    }
}

饿汉式单例,就是一个私有的构造方法加一个私有的静态当前类实例对象和一个公有的静态获取实例方法组成由于类实例对象为静态变量,所以在加载类的时候我们就会创建类的实例对象,这样的话比较消耗内存,浪费性能。

HTTP请求头和响应头部包括的信息一般有哪些

之前在看老齐的视频,做了一个百思不得姐爬虫的后台,效果还不错,准备过段时间买个服务器放上去。不过在这个项目中最重要的就是模拟请求、爬数据,让我了解到了okhttp这个工具贼好用,这里就不介绍了这个工具了,这里先分析原理、了解请求头和响应头。

Switch中的参数可以为那些类型

之前面试被问懵了一个很简单的问题,switch中的参数支持string吗,我当时想都没想,直接回答string可以为switch的参数,因为在我写的代码中我的确拿string当过参数:然而面试官说不可以。 (经过我的验证,我发现jdk1.7以后switch就支持String类型了;面试官傻逼!)

官方示例

1
https://docs.oracle.com/javase/tutorial/java/nutsandbolts/switch.html

Session与Cookie的区别

今天写公司项目的小demo的时候发现自己一个理解很不对的地方,用户的session 是否重复(在我之前的理解就是给的key 是一样的就会重复,或者覆盖):后台经过测试才发现,我共享session的时候给的key是一样的为什么获取的对象还是不一样,明明都是在内存当中(经过深究发现并不在内存中),为什么会存在这种情况