借助 explain 执行计划来分析索引失效的具体场景。explain 使用如下,只需要在查询的 SQL 前面添加上 explain 关键字即可。示例:explain select * from test where id=1;以上查询结果的列中,我们最主要观察 key 这一列,key 这一列表示实际使用的索引,如果为 NULL 则表示未使用索引,反之则使用了索引。以上所有结果列说明如下:id — 选择标识符,id 越大优先级越高,越先被执行;select_type — 表示查询的类型;table — 输出结果集的表;partitio...阅读全文>>
MySQL 中常用的两种时间储存类型分别是datetime和 timestamp。如何在它们之间选择是建表时必要的考虑。对于TIMESTAMP,它把写入的时间从当前时区转化为UTC(世界标准时间)进行存储。查询时,将其又转化为客户端当前时区进行返回。而对于DATETIME,不做任何改变,基本上是原样输入和输出。占用空间timestamp 4 字节datetime 8 字节表示范围timestamp所能存储的时间范围为:'1970-01-01 00:00:01.000000' 到 '2038-01-19 03:14:07.999999&...阅读全文>>
需要把其他库或者Excel中的数据批量导入到指定库中,业务中需要判断是否为重复数据,但是大量数据录入时判断是否重复,如何实现?创建测试表CREATE TABLE `test` ( `id` int(11) NOT NULL AUTO_INCREMENT , `name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT&nb...阅读全文>>
sql_mode是个很容易被忽视的变量,默认值是空值,在这种设置下是可以允许一些非法操作的,比如允许一些非法数据的插入。在生产环境必须将这个值设置为严格模式,所以开发、测试环境的数据库也必须要设置,这样在开发测试阶段就可以发现问题.sql model 常用来解决下面几类问题(1) 通过设置sql mode, 可以完成不同严格程度的数据校验,有效地保障数据准备性。(2) 通过设置sql model 为宽松模式,来保证大多数sql符合标准的sql语法,这样应用在不同数据库之间进行迁移时,则不需要对业务sql 进行较大的修改。(3) 在不同数据库之间进行数据迁移之前,通过设置SQL Mode 可以使...阅读全文>>
BlockingQueue也叫做阻塞队列,在某些情况下对BlockingQueue的访问可能会造成阻塞。被阻塞的情况主要有如下两种:当队列满了的时候进行入队列操作当队列空了的时候进行出队列操作阻塞队列一共有四套方法用来进行增、删、查,当每套方法对应的操作不能马上执行时会有不同的反应,下面这个表格就分类列出了这些方法:这4类方法有不同的行为1,Throws Exception如果操作不能立即被执行,那么将抛出异常2.Special Value如果操作不能被立即执行,那么将返回一个异常值(一般情况下是true/false)3.Blocks如果操作不能被立即执行,那么操作将会阻塞,直至可以执行。4T...阅读全文>>
常见的两种创建线程的方式。一种是直接继承Thread,另外一种就是实现Runnable接口。这两种方式都有一个缺陷就是:在执行完任务之后无法获取执行结果。从Java 1.5开始,就提供了Callable和Future,通过它们可以在任务执行完毕之后得到任务执行结果。Future模式的核心思想是能够让主线程将原来需要同步等待的这段时间用来做其他的事情。(因为可以异步获得执行结果,所以不用一直同步等待去获得执行结果)。上图简单描述了不使用Future和使用Future的区别,不使用Future模式,主线程在invoke完一些耗时逻辑之后需要等待,这个耗时逻辑在实际应用中可能是一次RPC调用,可能是...阅读全文>>
Selector提供选择执行已经就绪的任务的能力,使得多元 I/O 成为可能,就绪选择和多元执行使得单线程能够有效率地同时管理多个 I/O channel。C/C++许多年前就已经有 select()和 poll()这两个POSIX(可移植性操作系统接口)系统调用可供使用。许多os也提供相似的功能,但对Java 程序员来说,就绪选择功能直到 JDK 1.4 才成为可行方案。Selector的创建过程如下:// 1.创建Selector Selector selector = Selector.open(); // 2.将Channel注...阅读全文>>
AtomicInteger类是系统底层保护的int类型,通过提供执行方法的控制进行值的原子操作。AtomicInteger它不能当作Integer来使用。AtomicInteger与使用同步执行相同操作相比,使用它同样更快,更易读。在 JDK1.5 中新增了并发情况下使用的 Integer/Long 所对应的原子类AtomicInteger 和 AtomicLong。在并发的场景下,如果我们需要实现计数器,可以利用AtomicInteger和AtomicLong,这样一来,就可以避免加锁和复杂的代码逻辑,有了它们之后,我们只需要执行对应的封装好的方法,例如对这两个变量进行原子的增操作或原子的减...阅读全文>>
CountDownLatchCountDownLatch是一个同步工具类,它允许一个或多个线程等待其他线程一系列操作的完成。A synchronization aid that allows one or more threads to wait until a set of operations being performed in other threads completes.我们来看两个示例@Test public void CountDownLatchTest1() throws Exception { // 这里只有...阅读全文>>
首先,你要了解SpringBoot配置文件加载顺序,加载位置(代码内,Nacos等),当然这不是这里要说的,这里我们就是约定配置文件在resources下,一般有一个主配置文件application.yml,但是当配置过多时,一个配置文件,将会非常臃肿。所以我们需要把配置文件拆分,一些不需要动的,公用的,核心的配置放到application.yml下,其他的可以有多种拆分方式,例如可以分开发环境、测试环境、正式环境在bootstrap.yml增加配置标记当前环境spring: profiles: active:&nbs...阅读全文>>