MySQL高级—相关优化、锁、使用技巧
应用优化前面章节,介绍了很多数据库的优化措施。但是在实际生产环境中,由于数据库本身的性能局限,就必须要对前台的应用进行一些优化,来降低数据库的访问压力。
使用连接池对于访问数据库来说,建立连接的代价是比较昂贵的,因为频繁的创建关闭连接,是比较耗费资源的,我们有必要建立数据库连接池,以提高访问的性能。
减少对MySQL的访问避免对数据进行重复检索在编写应用代码时,需要能够理清对数据库的访问逻辑。能够一次连接就获取到结果的,就不用两次连接,这样可以大大减少对数据库无用的重复请求。比如 ,需要获取书籍的id 和name字段 , 则查询如下:
1select id , name from tb_book;
之后,在业务逻辑中有需要获取到书籍状态信息, 则查询如下:
1select id , status from tb_book;
这样,就需要向数据库提交两次请求,数据库就要做两次查询操作。其实完全可以用一条SQL语句得到想要的结果。
1select id, name , status from tb_book;
增加cache层在应用中,我们可以在应用中增加缓存层来达到减轻数据库 ...
MySQL高级—索引、视图、触发器
索引索引概述索引用于快速找出在某个列中有一特定值的行。不使用索引,MySQL必须从第1条记录开始读完整个表,直到找出相关的行。表越大,查询数据所花费的时间越多。如果表中查询的列有一个索引,MySQL能快速到达某个位置去搜寻数据文件,而不必查看所有数据。
MySQL官方对索引的定义为:索引(index)是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护者满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据, 这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。如下面的示意图所示 :
左边是数据表,一共有两列七条记录,最左边的是数据记录的物理地址(注意逻辑上相邻的记录在磁盘上也并不是一定物理相邻的)。为了加快Col2的查找,可以维护一个右边所示的二叉查找树,每个节点分别包含索引键值和一个指向对应数据记录物理地址的指针,这样就可以运用二叉查找快速获取到相应数据。
一般来说索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储在磁盘上。索引是数据库中用来提高性能的最常用的工具。
索引优势劣势优势
通过创建唯一索引,可 ...
数据库面试题
数据库事务的概念和特性?概念:事务(Transaction)是一个操作序列,不可分割的工作单位,以BEGIN TRANSACTION开始,以ROLLBACK/COMMIT结束。
特性(ACID):
原子性(Atomicity):逻辑上是不可分割的操作单元,事务的所有操作要么全部提交成功,要么全部失败回滚(用回滚日志实现,反向执行日志中的操作)。
一致性(Consistency):事务的执行必须使数据库保持一致性状态。在一致性状态下,所有事务对一个数据的读取结果都是相同的。
隔离性(Isolation):一个事务所做的修改在最终提交以前,对其它事务是不可见的(并发执行的事务之间不能相互影响)。
持久性(Durability):一旦事务提交成功,对数据的修改是永久性的。
数据库会出现哪些并发一致性问题?
丢失修改:一个事务对数据进行了修改,在事务提交之前,另一个事务对同一个数据进行了修改,覆盖了之前的修改。
脏读(Dirty Read):一个事务读取了被另一个事务修改、但未提交(进行了回滚)的数据,造成两个事务得到的数据不一致。
不可重复读(Nonrepeatable Read):在 ...
ConcurrentHashMap源码分析
ConcurrentHashMap的理解HashMap在多线程情况下,通过put方法进行插入操作时,如果元素超过了容量(由负载因子决定)的范围就会触发扩容操作,重新将原数组的内容重新hash到新的扩容数组中。在多线程的环境下,存在同时其他的元素也在进行put操作,如果hash值相同,可能出现同时在同一数组下用链表表示时,造成闭环,导致在get时会出现死循环,此外,put的时候也可能导致多线程数据不一致,所以HashMap是线程不安全的。
HashTable是线程安全的,它在所有涉及到多线程操作的都加上了synchronized关键字来锁住整个table,这就意味着所有的线程都在竞争一把锁,在多线程的环境下,它是安全的,但是无疑是效率低下的。
其实HashTable有很多的优化空间,锁住整个table这么粗暴的方法可以变得柔和点,比如在多线程的环境下,对不同的数据集进行操作时其实根本就不需要去竞争一个锁,因为它们操作不同hash值,不会因为rehash造成线程不安全,所以互不影响,这就是锁分离技术,将锁的粒度降低,利用多个锁来控制多个小的table。
JDK1.7 ConcurrentH ...
红黑树原理
二叉搜索树二叉搜索树的定义二叉搜索树(Binary Search Tree),它或者是一棵空树,或者是具有下列性质的二叉树:
若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
它的左、右子树也分别为二叉排序树。
二叉搜索树:通俗地讲,以当前节点为根,其左右子树的特点:左小右大。当前节点为50时,其左子树所有节点均小于50,右子树所有节点均大于50:
节点50的左右子树也同样符合这种特点,以左子树为例(以30为根的树):
同样的,其他的子树、子树的子树等均符合该规律(类似递归)。
二叉搜索树的查找根据左小右大的特点,查找一个元素时,从根节点出发:
如果查找的元素比当前节点小,则到左子树找;
如果查找的元素比当前节点大,则到右子树找;
如果查找的元素等于当前节点,说明找到了;
如果直至叶子节点都找不到对应的,说明该元素不存在该树中。
二叉搜索树的插入插入元素时,主要是找到合适的位置进行插入(类似查找):
插入的树为空树(无节点),直接创建节点即可;
插入 ...
HashMap1.7与1.8源码的区别
简介类定义123public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable
主要简介
数据结构:引入了 红黑树
存储流程
数组元素 & 链表节点的 实现类
HashMap中的数组元素 & 链表节点采用 Node类 实现。
与 JDK 1.7 的对比(Entry类),仅仅只是换了名字。
该类的源码分析如下:
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253/** * Node = HashMap的内部类,实现了Map.Entry接口,本质是 = 一个映射(键值对) * 实现了getKey()、getValue()、equals(Object o)和hashCode()等方法 **/ static class ...
java集合
java集合及特点 java中常见的数据结构,主要分为Collection和Map两种主要接口,程序中的数据结构是继承这些接口的数据结构类。
Collection接口:
List 接口继承:ArrayList、 Vector、 LinkedList等实现;
Set 接口继承:HashSet、LinkedHashSet、TreeSet等实现。
Map接口: HashMap、SortedMap继承,LinkedHashMap、TreeMap等实现。
几个常用的类及其特点:
ArrayList
数据结构:ArrayList底层使用的是Object数组;
存储结构:物理存储单元上连续的存储结构;
线程是否安全:线程不安全的;ArrayList是非同步的,方法没有加锁;
特点:方便查找,但是新增和删除操作的时候,是要有移动位置的操作,所以ArrayList适用于存储,查询操作比较频繁的数据存储。
LinkedList
数据结构:LinkedList底层使用的是双向循环链表数据结构;
存储方式:物理存储单元上非连续、非顺序的存储结构;
线程是否安全:线程不安 ...
LinkedList源码分析
linkedList说明LinkedList是List接口的另一种实现,它的底层是基于双向链表实现的,因此它具有插入删除快而查找修改慢的特点,此外,通过对双向链表的操作还可以实现队列和栈的功能。
LinkedList解释说明说明文档解释:
123456789101112131415161718* 双向链表是实现了List和Deque接口。实现了所有List的操作和允许值为Null。* * 所有的操作执行都与双向链表相似。操作索引将遍历整个链表,至于是从头开始遍历还是从尾部* 开始遍历取决于索引的下标距离哪个比较近。* * 需要注意的是这个方法不是同步的方法,需要同步的应用(ConcurrentLinkedDeque高效的队列),如果多个* 线程同时操作LinkedList实例和至少有一个线程修改list的结构,必须在外部加同步操作。* 关于结构性操作可以看前面的HashMap的介绍。这个同步操作通常是压缩在某些对象头上面。(synchronized就是存储在对象头上面)* * 如果对象头不存在这样的对象,这个列表应该使用{@link Collections#synchroni ...
ArrayList源码分析
ArrayList集合底层数据结构ArrayList是由可调整大小的数组实现的,与数组不同的是:数组一旦初始化长度就不可以发生改变,而ArrayList长度可变。
数组特点:
增删慢:每次删除元素,都需要更改数组长度、拷贝以及移动元素位置。
查询快:由于数组在内存中是一块连续空间,因此可以根据地址+索引的方式快速获取对应位置上的元素。
ArrayList继承关系12public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable
Serializable标记性接口
类的序列化由实现java.io.Serializable接口的类启用。 不实现此接口的类将不会使任何状态序列化或反序列化。 可序列化类的所有子类型都是可序列化的。 序列化接口没有方法或字段,仅用于标识可串行化的语义。
序列化:将对象的数据写入到文件(写对象)。
反序列化:将文件中对象的数据读取出来(读 ...
垃圾回收器
垃圾收集器概述垃圾收集器简要说明
如果说垃圾收集算法是内存回收的方法论,那垃圾收集器(回收器)就是内存回收的真正实践者。在《java虚拟机规范》中对垃圾收集器应该如何实现并没有做出任何规定,因此不同的厂商、不同的版本的虚拟机所包含的垃圾收集器都可能会有比较大的差别,比如之后要讲解的 Parallel 垃圾收集器与 CMS 垃圾收集器因为架构差别较大就不可以搭配使用,但不同的虚拟机一般也会提供各种参数供用户根据自己的应用特点和要求组合出各个内存分代所使用的垃圾收集器。
在介绍各种垃圾收集器的特性之前,需要明确一个重要的观点:虽然我们会对各种不同的垃圾收集器进行比较,但是并非是为了挑选出一个最好的垃圾收集器出来,虽然垃圾收集器的技术在不断的发展和进步,但是直到现在也没有最好的垃圾收集器出来,更加不存在 万能 的收集器,所以我们选择的只是对具体的应用场景下最合适的收集器,也就是我们常说的 具体情况具体分析。
垃圾收集器发展史有了虚拟机,就一定需要收集垃圾的机制,这就是 Garbage Collection ,对应的产品我们称为Garbage Collector。
1999年随 JDK1. ...