mysql索引什么时候会失效
1.使用了非索引列:如果查询中使用了非索引列,即使该列上有索引,也会导致索引失效。
2.使用了函数或表达式:在查询中使用函数或表达式,如ALTER FUNCTION
或UPDATE
语句中的表达式部分,会使索引失效。
3.对索引列进行了函数操作:在执行索引列上的函数操作后,如使用IF
语句中的表达式,也会导致索引失效。
4.使用了不等式运算符:在索引列上进行NOT IN
, NOT LIKE
, !=
等不等式运算符的操作,会使索引失效。
5.使用了链接操作符(JOIN):在连接子查询中使用了LEFT JOIN
或RIGHT JOIN
,且其中一个表没有覆盖索引,会导致整个查询的索引失效。
6.使用了OR操作符:如果一个查询中的OR
操作符后面没有同时使用索引,那么所有使用到的列都将失去索引效果。
7.使用了模糊查找(LIKE):如果LIKE查询以%
开始或结束,索引将会失效;但如果只以%
开头或结尾,索引则是有效的。
8.数据类型不匹配:如果查询的条件中使用了不同数据类型的列,可能会导致索引失效,尤其是当这些列的数据类型需要转换时。
9.查询条件不稳定:如果查询条件中含有变量或函数,它们可能在查询执行前尚未确定,这使得索引无法提前优化,从而可能导致索引失效。
10.数据量过小:如果表的记录数量非常少,以至于索引的大小不足以提供足够的性能提升,MySQL可能会选择放弃使用索引,转而进行全表扫描
@import注解的作用
springboot启动原理
- 加载配置文件与启动类
当 SpringBoot 项目启动时,会首先读取项目中的配置文件,主要是 application.yml 和 application.properties 文件。这些配置文件会指定项目的启动端口号、数据库连接等一些列配置信息。同时,SpringBoot也会加载启动类,这个启动类中有@SpringBootApplication注解,它标识着这个类是SpringBoot的启动类。
- 初始化Spring容器
加载完配置文件与启动类之后,SpringBoot会通过 Spring 框架来初始化 Spring 容器,包括根据配置文件中的配置信息注册bean,创建bean实例,完成依赖注入等操作。
- 开启自动配置功能
SpringBoot会自动扫描项目中的类,如果这些类中有@Configuration注解,SpringBoot将会读取这个类中被@Bean注解标记的方法去生成Bean实例并注入到Spring容器中。
- 启动内嵌的Web服务器
SpringBoot内置Tomcat和Jetty等Web服务器,当SpringBoot应用程序启动时,它会根据配置文件中的信息自动创建Tomcat或Jetty等Web容器,并将Spring容器注册到Web容器中,使得SpringBoot应用程序可以直接以Web应用程序的形式运行。
- 启动SpringBoot应用程序
最后一步是启动SpringBoot应用程序,它会根据之前的启动步骤创建好的 Spring 容器以及Web服务器,启动相应的线程进行服务处理。
总的来说,SpringBoot的启动流程相对简单,对于开发者而言,只需要关注自己的业务逻辑和所需要的依赖库,就能够快速构建出一款可运行的应用程序。
原文链接:springboot启动原理
多数据源的实现
redis持久化方式
1.RDB(Redis Database)
这种模式下,Redis会在指定的时间间隔内生成一个数据集快照,并将该快照写入到一个临时文件中。持久化完成后,旧的临时文件会被新的临时文件所替代,这样就可以实现数据的恢复。RDB持久化具有以下特点:
1.使用单个文件,便于管理和备份。
2.容灾性好,因为可以通过外部工具如福尔克斯进程来执行写操作。
3.主进程不会因为持久化而停止接收命令,从而保持高性能。
4.数据安全性相对较低,尤其是在频繁的持久化操作下,存在数据丢失的风险。
如果在持久化过程中出现故障,可能会导致数据丢失。
条件在redis.conf文件中配置,格式如下:
save (time) (count)
当满足在time(单位是秒)时间内,至少进行了count次修改后,触发条件,进行RDB快照。例如,默认的配置如下:
2.AOF(Append only file)
在这种模式下,Redis会按照命令行的协议记录所有的命令操作,并将其保存为一个AOF文件。AOF文件的每一条指令都会被记录到文件中,并且可以通过特定的模式写文件来实现即使在服务器崩溃的情况下也能保证数据的一致性。AOF的优点包括:
1.数据安全性较高,因为每个命令都被完整地记录下来。
2.文件大小可控,可以根据需要调整AOF的大小和频率。
3.可以配置AOF文件的属性,例如压缩级别,以优化文件大小和恢复速度。
缺点在于AOF文件通常较大,导致恢复速度较慢,且在大规模数据情况下启动效率较低。
当AOF文件变得非常大时,可能会对命令进行合并或删除不必要的命令,这有助于减少文件的大小。
redis集群和哨兵模式的区别
哨兵的作用就是监控Redis系统的运行状况。它的功能包括以下两个。
监控主数据库和从数据库是否正常运行。
主数据库出现故障时自动将从数据库转换为主数据库。
sentinel发现master挂了后,就会从slave中重新选举一个master。
哨兵模式强调高可用
集群
即使使用哨兵,redis每个实例也是全量存储,每个redis存储的内容都是完整的数据,浪费内存且有木桶效应。为了最大化利用内存,可以采用集群,就是分布式存储。即每台redis存储不同的内容,共有16384个slot。每个redis分得一些slot,hash_slot = crc16(key) mod 16384 找到对应slot,键是可用键,如果有{}则取{}内的作为可用键,否则整个键是可用键
集群至少需要3主3从,且每个实例使用不同的配置文件,主从不用配置,集群会自己选。
cluster是为了解决单机Redis容量有限的问题,将数据按一定的规则分配到多台机器。
集群模式提高并发量。
redis的分布式锁
arrayList的实现原理
什么是死锁及怎么避免死锁
死锁是指两个或多个进程或线程,彼此持有对方所需要的资源,导致彼此等待对方释放资源而无法继续执行的状态。在Java中,死锁通常是由于多线程并发执行时,线程之间互相等待获取对方持有的锁或资源而产生的。
死锁的产生必须同时满足以下四个必要条件:
互斥条件(Mutual exclusion):至少有一个资源被持有,且在任意时刻只有一个进程能够使用该资源。
请求与保持条件(Hold and wait):进程已经持有至少一个资源,并且在等待获取其他进程持有的资源。
不剥夺条件(Non-preemption):进程已经获得的资源在未使用完之前不能被剥夺,只能自愿释放。
循环等待条件(Circular wait):进程之间形成一种头尾相接的循环等待资源关系。
预防死锁的方法主要有以下几种:
避免使用多个资源:如果只使用一个资源,那么就不可能发生死锁。
破坏循环等待条件:按照资源的顺序来申请资源,或者给每个资源分配一个编号,按照编号顺序来申请资源。
破坏请求与保持条件:一次性申请所有需要的资源,或者采用资源分配不会造成死锁的机制。
破坏不剥夺条件:如果一个进程持有资源的时间超过了一定的阈值,那么就剥夺该进程持有的资源。
需要注意的是,以上的预防死锁方法并不能完全消除死锁,只能减少死锁的发生概率,因此死锁的处理方法也是必不可少的。
悲观锁和乐观锁的实现
redis锁的实现
oauth2的令牌保留多久,保护机制
线程池的参数和拒绝策略
线程池的七个参数分别是:
corePoolSize:线程池中常驻的核心线程数,即使这些线程处理空闲状态,他们也不会被销毁,除非设置了allowCoreThreadTimeOut。12345678
maximumPoolSize:线程池能够容纳同时执行的最大线程数。
keepAliveTime:多余的空闲线程存活时间,当线程池中的线程数超过核心线程数时,多余的线程会在指定时间后,被销毁。
unit:keepAliveTime的时间单位,计量单位。
workQueue:任务队列,被提交但尚未执行的任务。
threadFactory:表示生成线程池中的工作线程的线程工厂。
handler:拒绝策略,表示当队列满了并且工作线程大于等于线程池的最大线程数(maximumPoolSize)时如何拒绝。
拒绝策略
AbortPolicy(默认):丢弃任务并抛出 RejectedExecutionException 异常。
CallerRunsPolicy:由调用线程处理该任务。
DiscardPolicy:丢弃任务,但是不抛出异常。可以配合这种模式进行自定义的处理方式。
DiscardOldestPolicy:丢弃队列最早的未处理任务,然后重新尝试执行任务。
1.redis分布式锁
获取锁:
使用set nx ex 获取锁,并设置超时时间
互斥:确保只能有一个线程获取锁
非阻塞:尝试一次,成功返回true,失败返回false
/服务器托管网/添加锁,nx是互斥(即这个key不存在才能创建),ex是设置超时时间
set lock thread1 nx ex 10
释放锁:
手动释放
超时剔除:获取锁时添加一个超时时间
//释放锁,删除即可
del key
2.redis为什么要用lua脚本解锁
3.redis的哨兵机制
Redis的哨兵机制是为了解决主从复制模式的缺陷而设计的,其主要功能包括:
监控:哨兵负责监控Redis集群中的每个节点及其自身的状态。
报警:当哨兵检测到一个节点或自身出现问题时,它会触发报警机制。
故障转移:当主节点发生故障时,哨兵会在从节点中选择一个新的主节点,并通过发布订阅模式通知从节点进行数据复制。
哨兵的工作原理涉及以下几个方面:
主从连接:哨兵启动时会建立与主节点的连接,用于获取服务器的运行状态信息。
订阅连接:哨兵也会建立与主节点的订阅连接,以便接收关于集群中其他哨兵节点的信息。
心跳检测:哨兵周期性地向主节点发送心跳包,以检查主节点的存活状态。
主观下线和客观下线:哨兵通过发送特定的命令来判断主节点是否处于主观下线状态,并在满足特定条件时将主节点标记为客观下线。
选举过程:当主节点被标记为客观下线时,哨兵会进行投票选举,选出新的主节点。
此外,哨兵机制还支持多哨兵配置,这样可以增加系统的可靠性,因为不同哨兵之间的相互监督可以提高故障检测的准确性。
总结来说,Redis的哨兵机制通过自动化故障转移过程,提高了Redis集群的高可用性和可扩展性,使得即使主节点发生故障,也能快速地从服务器托管网从节点中选举出一个新的主节点,确保服务的连续可用。
4.redis持久化
5.数据量很大的情况下,redis如何存储
redis缓存击穿,缓存穿透
6.springmvc的实现机制
7.springmvc从web到后端的步骤和原理
8.spring的那些属性需要通过容器管理来依赖注入,那些不需要
9.ioc和aop
10.springmvc的常用注解,获取请求参数用什么注解
11.springboot自动装配原理
12.spring的事务,7个传播事务
13.mybatis和hibernate的区别
14.spring如何引入mybatis
15.如何解决spring循环依赖
16.es的简介,索引库的创建方法
17.ik分词器的使用范围
18.nacos配置的自动刷新机制
19.集合hashMap的实现原理
20.ConcurrentHashMap实现原理
21.io文件流怎么判断读取完了
22.sql优化,慢sql的优化
23.mysql大的分页查询,分组查询,有子查询时怎么分页查询
24.从多个分表中查询数据,sql怎么写
mysql回表
在MySQL数据库中,回表(Look Up)指的是在进行索引查询时,首先通过索引定位到对应页,然后再根据行的物理地址找到所需的数据行。换句话说,回表是指根据索引查询到的主键值再去访问主键索引,从而获取完整的数据记录
mysql主键和普通索引的区别
25.@autoward和@resource的区别
静态锁和普通锁的区别
26.线程池的参数
①核心线程大小
②最大线程数
③空闲线程存活时间
④空闲线程存活时间单位
⑤工作队列
⑥线程工厂
⑦拒绝策略:
创建线程的方法
1.继承Thread类
2.实现Runnable接口
3.实现Callable接口
4.使用线程池创建
在创建线程的方法中,实现Runnable接口通常被认为是一种更好的方式,原因如下:
非侵入性:使用接口的方式允许类继承自另一个类,而不需要直接继承Thread类。这在应用设计中非常重要,因为继承通常意味着耦合,而解耦是设计良好软件的关键。
支持多实现:Java不支持多继承,但允许一个类实现多个接口。这意味着可以通过实现Runnable接口来创建多个不同行为的线程,而不需要修改原始类。
线程池支持:使用Executor框架可以更高效地管理线程池,这使得创建和控制线程变得更加容易。线程池可以有效地复用线程,减少创建和销毁线程的开销。
综上所述,实现Runnable接口的方式因其非侵入性、支持多实现以及线程池支持的优势,被广泛认为是创建线程的更好方法。
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
文章目录 C语言中自定义数据类型 枚举类型 结构体类型 复数类型 C语言中自定义数据类型 枚举类型 形式: 声明:enum 枚举类型名 { 枚举符列表, }枚举变量名; 使用:enum 枚举类型名 枚举变量名 = 枚举符; 枚举变量占4字节与int相同,存储方…