前言 一阵熟悉的起床闹钟响起,小菜同学醒来竟发现周围都是导致索引失效的原因:性感迷人的索引使用不当、可爱活泼的存储引擎无法识别索引列、刁蛮任性的优化器不选择索引... 知其然更要知其所以然,一起来看看索引为啥失效了吧 在阅读文本前,需要知道聚簇索引、二级索引、回表等知识,如果同学不太了解可以去查看往期文章 什么是索引失效呢? 对于MySQL常使用的索引来说,往往是聚簇索引和二级索引 索引失效指的是在某些场景下,MySQL不使用二级索引,而去使用聚簇索引(全表扫描),从而导致二级索引失效(索引失效中的索引指的是二级索引) 不够熟悉索引导致使用不当 索引使用不当往往是因为我们不够了解索引 在聚簇索...

  bP0sGmhCs7ek   2023年11月18日   21   0   0 面试Java面试Java

前言 在MySQL的查询中常常会用到orderby和groupby这两个关键字 它们的相同点是都会对字段进行排序,那查询语句中的排序是如何实现的呢? 当使用的查询语句需要进行排序时有两种处理情况: 当前记录本来就是有序的,不需要进行排序 当前记录未保持顺序,需要排序 使用索引保证有序 对于第一种情况,常常是使用二级索引中索引列的有序来保证结果集有序,从而不需要进行排序 对于表a,为a2建立二级索引,那么在二级索引上a2就是有序的  CREATETABLE`a`(   `a1`int(11)NOTNULLAUTO_INCREMENT,   `...

  bP0sGmhCs7ek   2023年11月17日   17   0   0 面试Java面试Java

MySQL的3种索引合并优化⭐️or到底能不能用索引? 前言 前文我们讨论过MySQL优化回表的多种方式:索引条件下推ICP、多范围读取MRR、覆盖索引等 这篇文章我们来聊聊MySQL提供的另一种优化回表的手段:indexmerge索引合并 在阅读本文前,你需要了解MySQL的server层与存储引擎层如何交互、二级索引和聚簇索引的区别、回表等知识 如果同学不太了解这些知识可以回看前文: MySQL的优化利器⭐️索引条件下推,千万数据下性能提升273%🚀 MySQL的优化利器⭐️MultiRangeRead与CoveringIndex是如何优化回表的? MySQL导致索引失效的八股文中有这样...

MySQL连接的原理⭐️4种优化连接的手段性能提升240%🚀 前言 上两篇文章我们说到MySQL优化回表的三种方式:索引条件下推ICP、多范围读取MRR与覆盖索引 MySQL的优化利器⭐️索引条件下推,千万数据下性能提升273%🚀 MySQL的优化利器⭐️MultiRangeRead与CoveringIndex是如何优化回表的? 这篇文章我们来聊聊MySQL中连接的原理以及连接的四种优化手段 为了更好的讲述文章内容,我们准备的两张表 一张是ICP文章中用到的学生表,学生表中有联合索引(age,studnet_name) CREATETABLE`student`( `id`bigint(20...

MySQL字段的字符类型该如何选择?千万数据下varchar和char性能竟然相差30%? 前言 上篇文章MySQL字段的时间类型该如何选择?千万数据下性能提升10%30%🚀我们讨论过时间类型的选择 本篇文章来讨论MySQL中字符类型的选择并来深入实践char与varchar类型的最佳使用场景 字符类型 我们最经常使用的字符串类型应该是char与varchar,它们作为本篇文章的主角,对于它们的描述我们放在后文详细介绍 文本字符串 当需要存储长文本时,可以使用文本类型 先来看看存储文本字符串的类型,从小到大依次为TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXT 它们分别用于...

  bP0sGmhCs7ek   2023年11月02日   28   0   0 Java

MySQL字段的时间类型该如何选择?千万数据下性能提升10%30%🚀 前言 在MySQL中时间类型的选择有很多,比如:date、time、year、datetime、timestamp... 在某些情况下还会使用整形int、bigint来存储时间戳 根据节省空间的原则,当只需要存储年份、日期、时间时,可以使用year、date、time 如果需要详细的时间,可以选择datetime、timestamp或者使用整形来存储时间戳 以下是不同类型的格式、时间范围、占用空间相关信息 类型 格式 范围 空间(字节Byte) date YYYY-MM-DD 1000-01-01to9999...

  bP0sGmhCs7ek   2023年11月02日   53   0   0 Java

10分钟从源码级别搞懂AQS(AbstractQueuedSynchronizer) 前言 上篇文章15000字、6个代码案例、5个原理图让你彻底搞懂Synchronized有说到synchronized由objectmonitor实现的 objectmonitor中由cxq栈和entrylist来实现阻塞队列,waitset实现等待队列,从而实现synchronized的等待/通知模式 而JDK中的JUC并发包也通过类似的阻塞队列和等待队列实现等待/通知模式 这篇文章就来讲讲JUC的基石AQS(AbstractQueuedSynchronizer) 需要了解的前置知识:CAS、volati...

  bP0sGmhCs7ek   2023年11月01日   81   0   0 Java

Synchronized 本篇文章将围绕synchronized关键字,使用大量图片、案例深入浅出的描述CAS、synchronizedJava层面和C层面的实现、锁升级的原理、源码等 大概观看时间17分钟 可以带着几个问题去查看本文,如果认真看完,问题都会迎刃而解: 1、synchronized是怎么使用的?在Java层面是如何实现? 2、CAS是什么?能带来什么好处?又有什么缺点? 3、markword是什么?跟synchronized有啥关系? 4、synchronized的锁升级优化是什么?在C层面如何实现? 5、JDK8中轻量级锁CAS失败到底会不会自旋? 6、什么是objectmo...

  bP0sGmhCs7ek   2023年11月01日   30   0   0 Java

前言 上篇文章10分钟从源码级别搞懂AQS(AbstractQueuedSynchronizer)说到JUC并发包中的同步组件大多使用AQS来实现 本篇文章通过AQS自己来实现一个同步组件,并从源码级别聊聊JUC并发包中的常用同步组件 本篇文章需要的前置知识就是AQS,如果不了解AQS的同学可以看上一篇文章哈 阅读本篇文章大概需要13分钟 自定义同步组件 为了更容易理解其他同步组件,我们先来使用AQS自己来实现一个常用的可重入锁 AQS模板方法流程是固定的,我们主要只需要来实现它的尝试获取同步状态和尝试释放同步状态方法即可 首先我们先规定要实现的可重入锁是独占式的 规定同步状态一开始为0,当有...

  bP0sGmhCs7ek   2023年11月01日   45   0   0 Java

前言 上篇文章13分钟聊聊并发包中常用同步组件并手写一个自定义同步组件聊到并发包中常用的同步组件,并且还手把手实现了自定义的同步组件 本篇文章来聊聊并发包下的另一个核心-线程池 阅读本文大概12分钟 通读本篇文章前先来看看几个问题,看看你是否以及理解线程池 什么是池化技术?它有什么特点,哪些场景使用? Executor是什么?它的设计思想是什么样的? 工作任务有几种?有什么特点?如何适配然后交给Executor的? 线程池是如何实现的?有哪些核心参数,该如何配置?工作流程是怎样的? 线程池如何优雅的处理异常?如何关闭线程池? 处理定时的线程池是如何实现的? 池化技术 线程的创建、销毁都会带...

  bP0sGmhCs7ek   2023年11月01日   41   0   0 Java

上篇文章12分钟从Executor自顶向下彻底搞懂线程池中我们聊到线程池,而线程池中包含阻塞队列 这篇文章我们主要聊聊并发包下的阻塞队列 阻塞队列 什么是队列? 队列的实现可以是数组、也可以是链表,可以实现先进先出的顺序队列,也可以实现先进后出的栈队列 那什么是阻塞队列? 在经典的生产者/消费者模型中,生产者们将生产的元素放入队列,而消费者们从队列获取元素消费 当队列已满,我们会手动阻塞生产者,直到消费者消费再来手动唤醒生产者 当队列为空,我们会手动阻塞消费者,直到生产者生产再来手动唤醒消费者 在这个过程中由于使用的是普通队列,阻塞与唤醒我们需要手动操作,保证同步机制 阻塞队列在队列的基础上提...

  bP0sGmhCs7ek   2023年11月01日   32   0   0 Java

前言 ThreadLocal可以用来存储线程的本地数据,做到线程数据的隔离 ThreadLocal的使用不当可能会导致内存泄漏,排查内存泄漏的问题,不仅需要熟悉JVM、利用好各种分析工具还耗费人工 如果能明白其原理并正确使用,就不会导致各种意外发生 本文将从使用场景、实现原理、内存泄漏、设计思想等层面分析ThreadLocal,并顺带聊聊InheritableThreadLocal ThreadLocal使用场景 什么是上下文? 比如线程处理一个请求,请求会经过MVC流程,由于流程很长,会经历很多方法,这些方法就可以叫上下文 ThreadLocal作用在上下文中存储常用的数据、存储会话信息、存...

  bP0sGmhCs7ek   2023年11月01日   41   0   0 Java

前言 在日常的开发中,我们经常使用key-value键值对的HashMap,其使用哈希表实现,用空间换取时间,提升查询性能 但在多线程的并发场景中,HashMap并不是线程安全的 如果想使用线程安全的,可以使用ConcurrentHashMap、HashTable、Collections.synchronizedMap等 但由于后面二者使用synchronized的粒度太大,因此一般不使用,而使用并发包中的ConcurrentHashMap 在ConcurrentHashMap中,使用volatile保证内存可见性,使得读场景下不需要“加锁”保证原子性 在写场景下使用CAS+synchroni...

  bP0sGmhCs7ek   2023年11月01日   29   0   0 Java
关注 更多

空空如也 ~ ~

粉丝 更多

空空如也 ~ ~