MySQL高级篇-10-索引优化与查询优化
索引失效案例MySQL中提高性能的一个最有效的方式是对数据表设计合理的索引。索引提供了高效访问数据的方法,并且加快查询的速度,因此索引对查询的速度有着至关重要的影响。
使用索引可以快速地定位表中的某条记录,从而提高数据库查询的速度,提高数据库的性能。
如果查询时没有使用索引,查询语句就会扫描表中的所有记录。在数据量大的情况下,这样查询的速度会很慢。
大多数情况下都(默认)采用B+树来构建索引。只是空间列类型的索引使用R-树,并且MEMORY表还支持hast索引。其实,用不用索引,最终都是优化器说了算。优化器是基于cost开销(CostBaseOptimizer),它不是基于规则(Rule-BasedOptimizer),也不是基于语义。另外,SQL语句是否使用索引,跟数据库版本、数据量、数据选择度都有关系。
全值匹配我最爱系统中经常出现的SQL语句如下:
1EXPLAIN SELECT SQL_NO_CACHE * FROM student WHERE age=30;
1EXPLAIN SELECT SQL_NO_CACHE * FROM student WHERE age=30 ...
算法提升-2-KMP
引入问题
给定两个字符串str和match,长度为 $N$ 和 $M$ 。如果字符串str中含有子串match,返回match在str中开始位置。
如果match的长度大于str长度( $M>N$ ),str必然不会含有match,可直接返回-1。但如果 $N≥M$ ,要求算法复杂度为 $O(M)$
next数组next数组含义next[i] 的含义是在 match[i] 之前的字符串 match[0..i-1] 中,必须以 match[i-1] 结尾的 后缀子串 与必须以match[0]开头的 前缀子串 最大匹配长度
后缀字符不能包含match[0],即整个后缀不能是本身
前缀字符不能包含match[i-1],即整个前缀不能是本身
求解next数组match[0] :他之前没有字符,next[0] 规定为 -1
match[1] :next数组定义要求任何子串后缀不能包含第一个字符,故 match[1] 之前的字符串只有长度为0的后缀字符串,next[1] 规定为0
match[i]
1.从左至右依次求解next,求解 next[i] 时,next[i-1] ...
MySQL高级篇-9-性能分析工具的使用
数据库服务器的优化步骤
首先在S1部分,需要观察服务器的状态是否存在周期性的波动。如果存在周期性波动,有可能是周期性节点的原因,比如双十一、促销活动等。这样的话,可以通过A1加缓存,或者更改缓存失效策略。
如果缓存策略没有解决,或者不是周期性波动的原因,就需要进一步分析查询延迟和卡顿的原因。接下来进入S2这一步,需要开启慢查询。慢查询可以定位执行慢的SQL语句。可以通过设置long_query_time参数定义“慢””的阈值,如果SQL执行时间超过long_query_time,则会认为是慢查询。当收集上来这些慢查询之后就可以通过分析工具对慢查询日志进行分析。
在S3这一步骤中就知道了执行慢的SQL,就可以针对性地用EXPLAIN查看对应SQL语句的执行计划,或者使用show profile查看SQL中每一个步骤的时间成本,了解SQL查询慢是因为执行时间长,还是等待时间长。
如果是SQL等待时间长,我们进入A2步骤。在这一步骤中,可以调优服务器的参数,比如适当增加数据库缓冲池等。
如果是SQL执行时间长,就进入A3步骤,这一步中我们需要考虑是索引设计的问题?还是查询关联的数据表过多? ...
JUC-6-volatile与JMM
volatile
被volatile修饰的变量特点
可见性
有序性
volatile内存语义
当写一个volatile变量时,JMM会把该线程对应的本地内存中的共享变量值立即刷新回主内存中
当读一个volatile变量时,JMM会把该线程对应的本地内存设置为无效,重新回到主内存中读取最新共享变量
volatile写的内存语义是直接刷新到主内存中,读的内存语义是直接从主内存中读取。
内存屏障内存屏障(内存栅栏,屏障指令等),是一类同步屏障指令,是CPU或编译器在对内存随机访问的操作中的一个同步点,使得此点之前的所有读写操作都执行后才可以开始执行此点之后的操作,避免代码重排序。内存屏障其实就是一种JVM指令,Java内存模型的重排规则会要求Java编译器在生成JVM指令时插入特定的内存屏障指令,通过这些内存屏障指令,volatie实现了Java内存模型中的可见性和有序性(禁重排),但volatile无法保证原子性。
内存屏障之前的所有写操作都要回写到主内存,内存屏障之后的所有读操作都能获得内存屏障之前的所有写操作的最新结果(实现了可见性)。写屏障(Store Memor ...
JUC-5-Java内存模型JMM
JMM 概念JVM规范中试图定义一种Java内存模型(Java Memory Model)来屏蔽各种硬件和操作系统的内存访问差异,以实现让Java程序在各平台下都能达到一致的内存访问效果
JMM本身是一种抽象的概念并不真实存在它仅仅描述的是一组约定或规范,通过这组规范定义了程序中(尤其是多线程)各个变量的读写访问方式并决定一个线程对共享变量的写入何时以及如何变成对另一个线程可见,关键技术占都是围绕多线程的原子性、可见性和有序性展开的
通过JMM 实现线程和主内存之间的抽象关系
屏蔽各个硬件平台和操作系统的内存访问差异以实现让Java程序在各平台下都能达到一致的内存访问效果
JMM 三大特性可见性可见性是指当一个线程修改了某一个共享变量的值,其他线程是否能够立即知道该变更,JMM规定了所有的变量都存储在主内存中。
系统主内存共享变量数据修改被写入的时机是不确定的,多线程并发下很可能出现”脏读”,所以每个线程都有自己的工作内存、线程自己的工作内存中保存了该线程使用到的变量的主内存副本拷贝。
线程对变量的所有操作(读取,赋值等)都必需在线程自己的工作内存中进行,而不能够直接读写主内 ...
MySQL高级篇-8-索引的创建与设计原则
索引的声明与使用索引的分类 MySQL的索引包括普通索引、唯一性索引、全文索引、单列索引、多列索引和空间索引等。
从功能逻辑上说,索引主要有 4 种,分别是普通索引、唯一索引、主键索引、全文索引。
按照物理实现方式,索引可以分为 2 种:聚簇索引和非聚簇索引
按照作用字段个数进行划分,分成单列索引和联合索引
普通索引
在创建普通索引时,不附加任何限制条件,只是用于提高查询效率。这类索引可以创建在任何数据类型中,其值是否唯一和非空,要由字段本身的完整性约束条件决定。建立索引以后,可以通过索引进行查询。
例如,在表student的字段name上建立一个普通索引,查询记录时就可以根据该索引进行查询。
唯一性索引
使用UNIQUE参数可以设置索引为唯一性索引,在创建唯一性索引时,限制该索引的值必须是唯一的,但允许有空值。在一张数据表里可以有多个唯一索引。例如,在表student的字段email中创建唯一性索引,那么字段email的值就必须是唯一的。通过唯一性索引,可以更快速地确定某条记录。
主键索引
主键索引就是一种特殊的唯一性索引,在唯一索引的基础上增加了不为空的约束,也 ...